Return returns 链式承诺的函数类型

Return type of a function that returns a chained promise

我有一个 class,它 return 是一个链式承诺,第一个承诺的类型是 angular.IPromise<Foo>,第二个承诺的解析类型是 angular.IPromise<Bar>

为什么是doSomethingangular.IPromise<Bar>的return类型?

我原以为 return 类型会是 angular.IPromise<Foo>,因为这是函数 return 编辑的第一件事。我知道 then() return 是一个承诺,并将 return 编辑的内容包装到它的响应中,但这仍然让我感到困惑。

import { Something } from '../somewhere';
import { Bar } from '../somewhereelse';

class Test {
    doSomething(): angular.IPromise<Bar> {
        return Something.getFoo() // getFoo() return type angular.IPromise<Foo>
            .then(() => {
                let x: Bar = {};        
                return x; 
            });
    }
}

如有任何帮助,我们将不胜感激。如果需要,我非常乐意提供更多代码。

此 returns angular.IPromise<Bar>,前提是代码可以编译。

接口可以映射到任意数量的 类,并且可以使用前缀为 I 的名称轻松识别它们。

具体类型将是 Promise 实现的细节,但是它满足 IPromise<Bar> 只要它 return 是 Bar 解决。

编辑:TypeScript 通过 then<TResult>(successCallback: (promiseValue: T) => IPromise<TResult>|TResult, ...): IPromise<TResult> 中的模板参数确定它。这静态地确定了回调的 return 类型。 source

另见:Whats the difference between "declare class" and "interface" in TypeScript

第一件事是:你没有 return Something.getFoo()。 你returnSomething.getFoo().then(...)。即使使用 promise 来执行异步任务,它们也会立即 returned。

then() returnangular.IPromise returned 承诺不是来自 Something.getFoo() 的承诺,而是 returned 的承诺Something.getFoo().then(...)

并且由于提供给 then() 的回调是 returning 一个 Bar 对象:promise.ten(foo=>return new Bar()) 你的语句实际上 return 是一个 Promise<Bar>对象。

如@TsatsuyukiIshi 所述,这是 angular.IPromise.then 的类型定义:

then<X>(successCallback: (promiseValue: T) => IPromise<X>|X, ...): IPromise<X>

此方法是通用的,其 return 类型 (X) 取决于作为参数提供的类型 ((promiseValue: T) => IPromise<X>|X)。

如果将 X 替换为 Bar,这很明显:

then(successCallback: (promiseValue: T) => IPromise<Bar>|Bar, ...): IPromise<Bar>