promise.reject的TypeScript类型定义

时间:2016-09-08 03:01:00

标签: typescript es6-promise

以下代码在返回的类型方面是正确的,因为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>>,但它更像是一种解决方法,而不是正确的解决方案。

如何写这个权利?

2 个答案:

答案 0 :(得分:10)

您不应该在承诺链中返回Promise.resolvePromise.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处理程序)。