promise.reject 的 TypeScript 类型定义

TypeScript type definition for promise.reject

以下代码就 return 编辑的类型而言是正确的,因为 then 总是 return 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 抛出错误:

The type argument for type parameter 'TResult' cannot be inferred from the usage. Consider specifying the type arguments explicitly. Type argument candidate 'void' is not a valid type argument because it is not a supertype of candidate 'string[]'.

但实际上,then永远不会returnvoid

我可以明确指定类型 .then<Promise<any>>,但这更像是一种变通方法,而不是正确的解决方案。

这个怎么写对?

Typescript 抱怨 return 类型在您的 Promise.reject return 值 (Promise<void>) 和 Promise.resolve 值 (Promise<string[]>).

将您的 then 调用转换为 .then<Promise<void | string[]>> 将使编译器知道联合 return 类型。

正如@basarat 指出的那样,您应该抛出错误而不是使用 Promise.reject(它将传递给提供的任何捕获处理程序)。

你不应该 return Promise.resolvePromise.reject 承诺链中。 resolve 应该由简单的 return 驱动,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