2 回答

TA貢獻1993條經(jīng)驗 獲得超6個贊
將類型參數(shù)更改為數(shù)組項,而不是整個數(shù)組:
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
可以是任何數(shù)組,但它也可以是 的子類型Array
,這意味著slice
不會返回適當(dāng)?shù)念愋停ㄋ鼘⒎祷?code>Array而不是任何T
類型)。通常,您不能將具體類型分配給泛型類型參數(shù),因為泛型類型參數(shù)可以是調(diào)用者決定的任何子類型,而您在實現(xiàn)中使用特定的具體類型。

TA貢獻1851條經(jīng)驗 獲得超4個贊
您遇到的問題是 T 可以是 的任何子類型unknown[],但是您的函數(shù)返回一個數(shù)組。因此,打字稿警告您數(shù)組不能轉(zhuǎn)換為T,這可能是數(shù)組的某個子類。相反,您可以將 T 更改為項目,并采用可迭代作為參數(shù)并返回一個數(shù)組:
// 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);
};
添加回答
舉報