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

问题描述:

我有一个返回链接承诺的类,第一个承诺的类型为angular.IPromise<Foo>,第二个承诺的类型为angular.IPromise<Bar>函数的返回类型返回链接的承诺

为什么它的doSomethingangular.IPromise<Bar>返回类型?

我本来以为,返回类型是angular.IPromise<Foo>因为那是由函数返回的第一件事。我知道,then()返回一个承诺,并将其返回的回应,但这仍然令我困惑。

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

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

+0

你怎么计算,返回类型是'角。IPromise '如果你声明'Bar'作为返回值的类型?打字稿不知道* runtime *返回值,它静态分析代码*。 –

+0

返回类型是angular.IPromise - 我可以很容易地测试。我期待返回类型是angular.IPromise ,因为这是doSomething()函数返回的第一件事。 –

+2

'.then'是'Promise','.map'是'Array'。 –

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

then()返回angular.IPromise返回的承诺是不Something.getFoo()一但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>

编辑:打字稿经由then<TResult>(successCallback: (promiseValue: T) => IPromise<TResult>|TResult, ...): IPromise<TResult>模板参数确定它。这将静态确定回调的返回类型。 source

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

+0

我不确定完全回答我的问题。我想我问“为什么是返回类型angular.IPromise 而不是angular.IPromise ”。调用getFoo()返回angular.IPromise ,这是doSomething()返回的第一件事情,为什么不是函数的返回类型? –

+0

@DaveCooper我已经在您的要求下添加了解释。如果能满足您的需求,我将非常感激您接受答案。 –

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

+6

可怕的建议-1 –