Promise<T> 的 TypeScript 参数,为什么不是 Promise<T1,T2>?

TypeScript params for Promise<T>, why not Promise<T1,T2>?

我想知道为什么 Promise<T> 不带两个参数,像这样:Promise<T1,T2>.

例如:

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');
     });
}

所以错误总是 any 不是真的吗?好像我们知道错误将是上面示例中的字符串...

因为 reject 参数类型为 (reason? : any) => void 您无法指定拒绝原因的类型。

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

主要针对这种情况:

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();
}