[英]How should I declare the return type of a function that returns a $q promise with no data?
[英]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>
的模板参数确定它。 这将静态确定回调的返回类型。 资源
如果需要从结果中返回不同类型,则可以使用any
类型。 打字稿不是100%强类型语言。 类型可以在运行时更改。 实际上,解析器中的参数只是被忽略,回调函数按预期返回了该类型。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.