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

我想知道为什么Promise<T>不需要两个参数,如下所示: Promise<T1,T2>

例如:

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

=>🌷🌷🌷如何告诉消费者关于err val两种types的承诺? 🌷🌷🌷

我希望T1Errortypes, T2val的types。

为什么不承诺采取两个types的参数? 因为它正式只有一个,我假设参数是传递给resolve()的值的types? 是否只有一个参数,因为我们期望一个Errortypes总是被传递给reject()

进一步的细节,我们可以传递一个string来拒绝:

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

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

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

所以这个错误可能永远是any事情都不是真的吗? 好像我们知道在上面的例子中错误将是一个string…

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

至于为什么这样input,最可能的主要原因是@Titian给的。 任何在代码中抛出一些东西的东西都会被承诺所吸引,并将承诺链作为错误传播出去。 给它一个types可能会使用户认为它应该只期望一个特定的types,而它可能真的是任何东西。

主要针对这样的情况:

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