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 的类型的承诺?
我希望 T1
是 Error
类型,T2
是 val
类型。
为什么 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();
}
我想知道为什么 Promise<T>
不带两个参数,像这样:Promise<T1,T2>
.
例如:
new Promise(function(resolve,reject){
...
err ? reject(err) : resolve(val);
});
=> 我如何告诉消费者关于 err 和 val 的类型的承诺?
我希望 T1
是 Error
类型,T2
是 val
类型。
为什么 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();
}