【问题标题】:TypeScript type definition for promise.rejectPromise.reject 的 TypeScript 类型定义
【发布时间】:2016-09-08 03:00:59
【问题描述】:

就返回的类型而言,以下代码是正确的,因为then 总是返回承诺数组。

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>>,但这更像是一种变通方法,而不是正确的解决方案。

这个怎么写?

【问题讨论】:

    标签: typescript es6-promise


    【解决方案1】:

    您不应该在承诺链中返回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

    【讨论】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2018-04-26
      • 2016-06-22
      • 1970-01-01
      • 2017-12-21
      • 2019-04-01
      • 2017-08-23
      • 2020-11-11
      • 2016-12-02
      • 2017-11-24
      相关资源
      最近更新 更多