2017-09-01 187 views
1

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

例如:

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

=>我怎么能告诉承诺的约都犯错 val的类型的消费者?

我期望T1Error类型和T2val的类型。

为什么不承诺带两个类型参数?因为它正式只有一个,我假设参数是传递给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的事情?似乎我们知道上述示例中的错误将是字符串...

+0

拒绝有'型(原因:任意)=> void',所以你可以把它任何东西。 – toskv

+0

我认为这是因为在Javascript中你可以抛出任何东西,很难预测错误类型是什么..但它只是一个预感。 –

+0

另外,为什么一个API被构建是不是真的是什么东西将能够回答,这是有点太广泛和基于意见。 – toskv

回答

1

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

至于为什么这样键入,最可能的主要原因是@Titian给出的。任何引发代码的内容都会被承诺所捕获,并将承诺链传播为错误。给它一种类型可能会使用户认为它应该只期望一种特定的类型,而它可能真的是任何的东西。

主要用于像这样的情况:

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

这部分是真实的,但对于简单的承诺,我们实际上知道的错误类型是什么。你总是可以添加一个catch块,并将错误强制为某种类型。 –

相关问题