跳到主內容

prefer-reduce-type-parameter

施加在呼叫 Array#reduce 時使用類型參數,而不要進行強制轉型。

🔧

有些問題是由這個規則報告並自動修復 --fix ESLint 命令列選項.

💭

此規則需要 類型資訊 執行。

通常會在 Array#reduce 後加上一個泛型類型,例如陣列或物件,作為初始值。由於這些值為空,其類型無法使用

  • [] 的類型為 never[],其中無法新增項目,因為沒有任何東西的類型為 never
  • {} 的類型為 {},其中沒有索引簽章,因此無法新增任何屬性

解決這個問題的一個常見做法是對初始值使用 as 斷言。儘管這會奏效,但它並不是最理想的解決方案,因為類型斷言會對基礎類型產生細微的影響,並可能造成錯誤的混入。

一個更好的解決方案是將類型明確定義為泛型類型參數傳遞到 Array#reduce。這表示 TypeScript 不必嘗試推論類型,並避免了轉型的常發缺陷。

此規則會查看呼叫 Array#reduce,並報告是否傳遞且斷言了初始值。它會建議改為將斷言類型作為泛型類型參數傳遞到 Array#reduce

.eslintrc.cjs
module.exports = {
"rules": {
"@typescript-eslint/prefer-reduce-type-parameter": "error"
}
};

在遊樂場嘗試這項規則 ↗

範例

[1, 2, 3].reduce((arr, num) => arr.concat(num * 2), [] as number[]);

['a', 'b'].reduce(
(accum, name) => ({
...accum,
[name]: true,
}),
{} as Record<string, boolean>,
);
在遊樂場中開啟

選項

此規則無從設定。

不應使用的時機

使用 .reduce 建立物件時,此規則有時難以變通。請參閱 [prefer-reduce-type-parameter] 無法修正的回報 #3440 以進一步了解資訊。您可以考慮使用 ESLint 禁用註解 處理那些特定情況,而不是完全停用這項規則。


類型檢查的 linting 規則比傳統的 linting 規則強大,但也需要設定 類型檢查的 linting。啟用類型檢查規則後,如果您遇到效能降低,請參閱 效能疑難排解

資源