繁体   English   中英

返回链式诺言的函数的返回类型

[英]Return type of a function that returns a chained promise

我有一个返回链式诺言的类,第一个诺言的类型为angular.IPromise<Foo> ,第二个诺言的类型为angular.IPromise<Bar>

为什么返回doSomething angular.IPromise<Bar>的返回类型?

我本以为返回类型将是angular.IPromise<Foo>因为那是该函数返回的第一件事。 我知道then()返回一个promise并将其返回的内容包装到那个响应中,但这仍然让我感到困惑。

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; 
            });
    }
}

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

第一件事是:您不返回Something.getFoo() 您返回Something.getFoo().then(...) 即使使用诺言来执行异步任务,也会立即返回它们。

then()返回一个angular.IPromise返回的承诺不是Something.getFoo()那个,而是Something.getFoo().then(...)返回的Something.getFoo().then(...)

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

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

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

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

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

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

如果代码可以编译,它将返回angular.IPromise<Bar>

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

具体类型将是Promise实现的详细信息,但是只要它返回有关解析的Bar ,它就可以满足IPromise<Bar>

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

另请参见: TypeScript中的“声明类”和“接口”之间有什么区别

如果需要从结果中返回不同类型,则可以使用any类型。 打字稿不是100%强类型语言。 类型可以在运行时更改。 实际上,解析器中的参数只是被忽略,回调函数按预期返回了该类型。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM