以下代码在返回的类型方面是正确的,因为then
总是返回promise数组。
Promise.resolve(['one', 'two'])
.then( arr =>
{
if( arr.indexOf('three') === -1 )
return Promise.reject( new Error('Where is three?') );
return Promise.resolve(arr);
})
.catch( err =>
{
console.log(err); // Error: where is three?
})
TypeScript抛出错误:
类型参数的类型参数' TResult'无法从使用中推断出来。考虑明确指定类型参数。 输入候选参数' void'不是有效的类型参数,因为它不是候选的超类型#string; ['。
但实际上,then
永远不会返回void
。
我可以明确指定类型.then<Promise<any>>
,但它更像是一种解决方法,而不是正确的解决方案。
如何写这个权利?
答案 0 :(得分:10)
您不应该在承诺链中返回Promise.resolve
和Promise.reject
。 resolve
应由简单返回驱动,而reject
应由明确的throw new Error
驱动。
Promise.resolve(['one', 'two'])
.then( arr =>
{
if( arr.indexOf('three') === -1 )
throw new Error('Where is three?');
return arr;
})
.catch( err =>
{
console.log(err); // Error: where is three?
})
更多关于承诺链https://basarat.gitbooks.io/typescript/content/docs/promise.html
答案 1 :(得分:3)
Typescript抱怨您的Promise.reject
返回值(Promise<void>
)与Promise.resolve
值(Promise<string[]>
)之间的回复类型存在差异。
将then
调用转换为.then<Promise<void | string[]>>
将让编译器知道union返回类型。
正如@basarat所说,你应该抛出一个错误,而不是使用Promise.reject(它将被传递给提供的任何catch处理程序)。