2 回答
TA贡献1993条经验 获得超5个赞
将类型参数更改为数组项,而不是整个数组:
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);
};
添加回答
举报