【问题标题】:TypeScript params for Promise<T>, why not Promise<T1,T2>?Promise<T> 的 TypeScript 参数,为什么不是 Promise<T1,T2>?
【发布时间】:2018-02-10 05:45:24
【问题描述】:

我想知道为什么 Promise&lt;T&gt; 不接受两个参数,例如:Promise&lt;T1,T2&gt;

例如:

new Promise(function(resolve,reject){
     ...
   err ? reject(err) : resolve(val);
});

=> ????????????如何告诉消费者关于 err val 类型的承诺? ????????????

我希望T1Error 类型,T2val 的类型。

为什么 Promise 不接受两个类型参数?因为官方只取一个,所以我假设参数是传递给resolve()的值的类型?是否只有一个参数,因为我们希望始终将 Error 类型传递给 reject()

更详细地说,我们可以传递一个字符串来拒绝:

  new Promise(function(resolve,reject){
       let err = 'just a string, not an object';
       let val = {foo:'bar'};
       err ? reject(err) : resolve(val);
    });

请注意,我们可以将错误强制转换为某种类型,如下所示:

return function(){
  return Promise.resolve('whatever')
    .catch(function(){
        return Promise.reject('always a string');
     });
}

所以错误总是anything 这不是真的吗?似乎我们知道错误将是上面示例中的字符串...

【问题讨论】:

  • reject 的类型为(reason? :any) =&gt; void,因此您可以发送任何内容。
  • 如果能指定拒绝原因的类型就好了。但是为什么它不是由打字稿开发人员制作的,所以 SO 无法帮助您。
  • SO 不会对标题的措辞提出“为什么”问题。 :) 你在帖子中的最后一个问题会是一个更好的标题。如何指定一个承诺的拒绝原因是可以帮助你的。这是一个你无法回答的不,但仍然不那么模棱两可。 :)
  • @AlexanderMills 以防我太微妙,我之前的回答是敦促您更改帖子的标题。 :D
  • 也许在未来的某个时候。目前,据我所知,没有办法使泛型声明中的一种类型成为可选,并且您不能使用不同的参数两次定义相同的接口。此更改会破坏大量代码。

标签: node.js typescript promise typescript2.3


【解决方案1】:

由于 reject 参数键入为(reason? : any) =&gt; void,因此您无法指定拒绝原因的类型。

至于为什么这样输入,最有可能的主要原因是@Titian 给出的那个。代码中任何抛出某些东西的东西都会被 Promise 捕获并作为错误传播到 Promise 链上。给它一个类型可能会让用户认为它应该只期望一个特定的类型,而它实际上可能是任何东西。

主要针对这种情况:

let x = new Promise<string>((resolve, reject) => {
  let rnd = Math.random();
  if (rnd < 0.3) {
    resolve('yeey works');
  } else if (rnd < 0.6) {
    reject('boo I dont like this number');
  } else {
    crash();
  }
});

x.then(console.log).catch(console.log);

function crash() {
  throw new DOMException();
}

【讨论】:

  • 这部分是正确的,但对于简单的 Promise,我们确实知道错误类型是什么。而且你总是可以添加一个 catch 块,并将错误强制转换为某种类型。
猜你喜欢
  • 2010-12-18
  • 2019-12-19
  • 2014-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多