函数的返回类型返回链接的承诺
我有一个返回链接承诺的类,第一个承诺的类型为angular.IPromise<Foo>
,第二个承诺的类型为angular.IPromise<Bar>
。函数的返回类型返回链接的承诺
为什么它的doSomething
angular.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;
});
}
}
任何帮助,将不胜感激。如果需要,我很乐意提供更多的代码。
的第一件事是:你不回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
我不确定完全回答我的问题。我想我问“为什么是返回类型angular.IPromise
@DaveCooper我已经在您的要求下添加了解释。如果能满足您的需求,我将非常感激您接受答案。 –
如果您需要从结果返回不同类型的,那么你可以使用any
类型。打字稿不是100%强类型的语言。该类型可以在运行时更改。实际上解析器的参数只是被忽略,回调函数按照预期返回了类型。
可怕的建议-1 –
你怎么计算,返回类型是'角。IPromise'如果你声明'Bar'作为返回值的类型?打字稿不知道* runtime *返回值,它静态分析代码*。 –
返回类型是angular.IPromise - 我可以很容易地测试。我期待返回类型是angular.IPromise ,因为这是doSomething()函数返回的第一件事。 –
'.then'是'Promise','.map'是'Array'。 –