Javascript 返回链接承诺的函数的返回类型

Javascript 返回链接承诺的函数的返回类型,javascript,angular,typescript,strong-typing,Javascript,Angular,Typescript,Strong Typing,我有一个类,它返回一个链式承诺,第一个承诺的类型是angular.IPromise,第二个承诺的类型是angular.IPromise 为什么它是doSomething angular.IPromise的返回类型 我认为返回类型应该是angular.IPromise,因为这是函数返回的第一件事。我知道,然后返回一个承诺,并将其返回的内容包装到该承诺的响应中,但这仍然让我困惑 import { Something } from '../somewhere'; import { Bar } from

我有一个类,它返回一个链式承诺,第一个承诺的类型是angular.IPromise,第二个承诺的类型是angular.IPromise

为什么它是doSomething angular.IPromise的返回类型

我认为返回类型应该是angular.IPromise,因为这是函数返回的第一件事。我知道,然后返回一个承诺,并将其返回的内容包装到该承诺的响应中,但这仍然让我困惑

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; 
            });
    }
}
任何帮助都将不胜感激。如果需要,我非常乐意提供更多的代码。

如果代码可以编译,则返回angular.IPromise

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

具体类型将是Promise实现的细节,但是只要返回resolve上的Bar,它就满足IPromise

EDIT:TypeScript通过successcallback:promiseValue:T=>IPromise | TResult,…:IPromise中的模板参数确定它。这将静态地确定回调的返回类型


另请参见:

如果需要从结果返回不同的类型,则可以使用任何类型。typescript不是100%强类型语言。该类型可以在运行时更改。实际上,解析程序中的参数被忽略,回调返回了预期的类型。

第一件事是:您没有返回Something.getFoo。 你还了些什么,快,然后。。。。即使承诺用于执行异步任务,也会立即返回

然后返回angular.i承诺返回的承诺不是来自某物的承诺。getFoo而是来自某物的承诺。getFoo。然后

由于提供给then的回调返回一个Bar对象:promise.tenfoo=>returnnewbar,因此您的语句实际上返回一个promise对象

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


如果将Bar声明为返回值的类型,您如何判断返回类型将是angular.IPromise?typescript不知道运行时返回值,它静态地分析代码。返回类型是angular.IPromise-我可以很容易地测试它。我希望返回类型是angular.IPromise,因为这是doSomething函数返回的第一个东西。然后是承诺as.map是数组。我不确定这是否完全回答了我的问题。我想我是在问为什么返回类型是angular.IPromise而不是angular.IPromise。对getFoo的调用返回angular.IPromise,这是doSomething返回的第一个内容,那么为什么函数的返回类型不是这个呢?@DaveCooper我根据您的要求添加了解释。如果这能满足你的需要,我会很感激你接受这个答案
then<X>(successCallback: (promiseValue: T) => IPromise<X>|X, ...): IPromise<X>
then(successCallback: (promiseValue: T) => IPromise<Bar>|Bar, ...): IPromise<Bar>