TypeScript类型定义:promise.reject。

16

以下的代码在返回类型方面是正确的,因为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个回答

12

在 Promise 链中,不应该返回 Promise.resolvePromise.reject。应该使用简单的 return 来驱动 resolve,并使用显式的 throw new Error 来驱动 reject

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?
})

更多

有关Promise链的更多信息,请参见https://basarat.gitbooks.io/typescript/content/docs/promise.html


8
当然,作为最佳做法,你是正确的,但同时也没有理由不能在then处理程序内返回Promise.resolve()和/或Promise.reject()。OP有一个合理的问题,就是为什么TypeScript对此感到不满意。 - user663031
3
“不应该返回 Promise.resolve 和 Promise.reject 的原因是什么?”我不理解为什么有人认为这是“最佳实践”。Promises 的核心在于可链接性,这是一个很好的原则。为什么要抛出一个将被转换为拒绝状态的异常,而不是自己创建一个拒绝状态的 Promise 呢? - DanielM

3

Typescript 抱怨你的 Promise.reject 返回值类型(Promise<void>)和你的 Promise.resolve 值(Promise<string[]>)之间的返回类型不同。

将你的 then 调用强制转换为 .then<Promise<void | string[]>> 将让编译器知道联合返回类型。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接