對于這個模糊的標題,我感到很抱歉,但是我不知道如何簡潔地表達這個問題。
基本上,我有以下代碼(去掉了不重要的部分):
我有以下代碼(去掉了不重要的部分)。
function identity<T>(value: T)。T {
return value。
}
function extent<T, K>(
values: T[],
map: (value: T) => K = identity //the '= identity' part gives an error。
): [K, K] | undefined {
let min;
let max;
//...東西...
return min === undefined || max === undefined ? undefined : [map(min), map(max)]。
}
其中默認的= identity值會導致編譯器錯誤。
我可以從extent的簽名中洗掉map引數的默認值,并且總是自己提供一個:
extent([5, 1, 3, 4, 8], x => x)
這可以很好地作業,但我寧愿不提供第二個引數,除非我真的將值從一種型別映射到另一種型別。
我如何鍵入indentity函式,以便它被接受為extent的map引數的默認值?我暫時還停留在TypeScript 3.6上,如果這有關系的話。
uj5u.com熱心網友回復:
可能處理這個問題的最好方法是通過多載來維持外部世界的型別安全:
function extent<T>(values: T[] )。) [T, T] | undefinedfunction extent<T, K>(values: T[], map: (value: T) => K)。) [K, K] | undefinedfunction extent<T, K>(
values: T[],
map? (value: T) =>/span> K
): [K, K] | [T, T] | undefined {
const actualMap = map ?? identity;
let min;
let max;
//...東西...
return min === undefined ||
max === undefined ?
undefined :
[actualMap(min), actualMap(max)]。
uj5u.com熱心網友回復:
這是因為型別錯誤的緣故。
在map引數中,你宣告這個函式將回傳K的型別,但是在identity函式中,你希望它回傳T的型別,所以你不能把它作為一個默認值。
你可以這樣來解決這個問題。map: (value: K) => K = identity
uj5u.com熱心網友回復:
地圖的T => K型別和身份函式的K => K型別有沖突。讓identity對型別不那么嚴格可以幫助:
function identity<T> (value: T): any {
return value。
}
或者甚至
const identity = (x: any)=> x;
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/318609.html
標籤:
