亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在 Typescript 中從數組中隨機選取 N 個項目的函數

在 Typescript 中從數組中隨機選取 N 個項目的函數

慕碼人2483693 2023-07-06 17:48:08
我使用泛型類型參數:T extends unknown[],因為此函數應該適用于任何類型的數組。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);};但我在聲明中收到以下錯誤return:如果我進行類型斷言,它就會消失。但為什么有必要呢?難道我做錯了什么?筆記:下面的行被評估為unknown[],那么為什么類型斷言仍然是必要的呢?const?result?=?shuffled.slice(0,?n);
查看完整描述

2 回答

?
ibeautiful

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類型)。通常,您不能將具體類型分配給泛型類型參數,因為泛型類型參數可以是調用者決定的任何子類型,而您在實現中使用特定的具體類型。


查看完整回答
反對 回復 2023-07-06
?
繁花不似錦

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);

};


查看完整回答
反對 回復 2023-07-06
  • 2 回答
  • 0 關注
  • 341 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號