這段代碼
function myFilter(debts:Map<string, number>) : Map<string, number>{
return new Map([...debts]
.map(d => [d[0], Math.round(d[1] * 10) / 10]) // error
.filter(d => d[1] != 0)
)
}
給出一個錯誤,因為map()表面上可以 yield [string | number][][]。
但這確實有效:
function myFilter(debts:Map<string, number>) : Map<string, number>{
return new Map([...debts]
.map(d => [d[0], Math.round(d[1] * 10) / 10] as [string, number])
.filter(d => d[1] != 0)
)
}
我不明白為什么這個斷言是必要的。
uj5u.com熱心網友回復:
為什么?
因為 TypeScript 不會在回呼中推斷元組回傳型別:
.map(d => [d[0], Math.round(d[1] * 10) / 10])
它被推斷為每個元素上所有可能值型別的聯合:如果使用顯式回傳陳述句重寫它,您可以看到推斷的型別:
TS游樂場
.map(d => {
const result = [d[0], Math.round(d[1] * 10) / 10];
//^? const result: (string | number)[]
return result;
})
替代解決方案:
您還可以在使用Array.prototype.map<T>()而不是使用型別斷言時提供泛型型別引數:
TS游樂場
.map<[string, number]>(d => [d[0], Math.round(d[1] * 10) / 10])
這將使編譯器滿意,并有助于確保回呼回傳的值可分配給提供的泛型型別。
uj5u.com熱心網友回復:
我不明白為什么這個斷言是必要的。
因為[string, number]只是(string | number)[]可能涵蓋的幾種可能的組合/型別之一。
但它也可能包含任何這些[number]或[number, string]或[string, string, string]以及更多與Map<string, number>.
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/510415.html
標籤:打字稿
