我正在嘗試創建一個函式,該函式處理數字陣列或字串數??組并從該陣列回傳 Set,如下所示:
const f = (arr: number[] | string[]): number[] | string[] => {
return [...new Set(arr)];
}
并得到一個錯誤:
沒有多載匹配這個呼叫。
多載 1 of 2, '(iterable?: Iterable | null | undefined): Set',出現以下錯誤。'number[] 型別的引數 | string[]' 不可分配給型別為 'Iterable | 的引數 空| 不明確的'。型別 'string[]' 不可分配給型別 'Iterable'。'Symbol.iterator.next(...)' 回傳的型別在這些型別之間不兼容。型別 'IteratorResult<string, any>' 不能分配給型別 'IteratorResult<number, any>'。型別“IteratorYieldResult”不可分配給型別“IteratorResult<number, any>”。型別“IteratorYieldResult”不可分配給型別“IteratorYieldResult”。“字串”型別不能分配給“數字”型別。
多載 2 of 2, '(values?: readonly number[] | null | undefined): Set',出現以下錯誤。'number[] 型別的引數 | string[]' 不能分配給型別為 'readonly number[] | 的引數 空| 不明確的'。型別 'string[]' 不能分配給型別 'readonly number[]'。型別 'string' 不能分配給型別 'number'。
我可以將傳入型別從number[] | string[]to更改,(number | string)[]但這意味著陣列中可以同時是數字和字串,這不是我想要的。
const f = (arr: (number | string)[]): (number | string)[] => {
return [...new Set(arr)];
}
f([1,2,3]); // ok
f(['1','2','3']); // ok
f([1,2,'3','4']); // ok, but should be err
f([true, {}, 1]); // err, like it should be
uj5u.com熱心網友回復:
編輯:似乎這與某些 TS 配置有關。一種方法是傳播您正在制作集合的陣列并轉換回傳值,如下所示:
const f = (arr: number[] | string[]): number[] | string[] => {
return Array.from(new Set([...arr])) as number[] | string[];
}
正如 udalmik 所說,你可以使用,any盡管這有點違背了這一點。
uj5u.com熱心網友回復:
您可以通過將引數強制轉換為any[]:
function f(arg: number[] | string[]): number[] | string[] {
return [...new Set(arg as any[])];
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/354656.html
標籤:javascript 数组 打字稿
