promise.reject的TypeScript类型定义

ktr*_*yak 12 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?
})
Run Code Online (Sandbox Code Playgroud)

TypeScript抛出错误:

类型参数'TResult'的类型参数不能从用法中推断出来.考虑明确指定类型参数.类型参数候选'void'不是有效的类型参数,因为它不是候选'string []'的超类型.

但实际上,then永远不会回归void.

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

怎么写这个吧?

bas*_*rat 11

你不应该回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?
})
Run Code Online (Sandbox Code Playgroud)

更多

有关承诺链的更多信息https://basarat.gitbooks.io/typescript/content/docs/promise.html

  • 作为一种最佳实践,当然你是对的,但同时没有理由不能从`then`处理程序中返回`Promise.resolve()`和/或`Promise.reject()`, OP有一个合理的问题,为什么TypeScript对此不满意. (6认同)
  • “你不应该返回`Promise.resolve`和`Promise.reject`”的原因是什么?我不明白为什么有人会认为这是“最佳实践”。可链性是 Promise 的核心,也是一个伟大的原则。为什么要抛出一个将被转换为被拒绝的承诺的异常而不是自己创建被拒绝的承诺? (3认同)