2 回答

TA貢獻1993條經驗 獲得超6個贊
將類型參數更改為數組項,而不是整個數組:
export const pickRandomItems = <T extends unknown> (arr: T[], n: number): T[] => {
? const shuffled = Array.from(arr).sort(() => 0.5 - Math.random());
? return shuffled.slice(0, n);
};
雖然T extends unknown[]
does 意味著T
可以是任何數組,但它也可以是 的子類型Array
,這意味著slice
不會返回適當的類型(它將返回Array
而不是任何T
類型)。通常,您不能將具體類型分配給泛型類型參數,因為泛型類型參數可以是調用者決定的任何子類型,而您在實現中使用特定的具體類型。

TA貢獻1851條經驗 獲得超4個贊
您遇到的問題是 T 可以是 的任何子類型unknown[],但是您的函數返回一個數組。因此,打字稿警告您數組不能轉換為T,這可能是數組的某個子類。相反,您可以將 T 更改為項目,并采用可迭代作為參數并返回一個數組:
// trailing comma in generic so ts doesn't confuse with jsx
export const pickRandomItems = <T,> (arr: Iterable<T>, n: number): T[] => {
const shuffled = Array.from(arr).sort(() => 0.5 - Math.random());
return shuffled.slice(0, n);
};
添加回答
舉報