2017-09-01 181 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塊,並將錯誤強制爲某種類型。 –

相關問題