prefer-reduce-type-parameter
施加在呼叫
Array#reduce
時使用類型參數,而不要進行強制轉型。
🔒
擴充 "plugin:@typescript-eslint/strict-type-checked"
在 ESLint 組態 中啟用此規則。
🔧
有些問題是由這個規則報告並自動修復 --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>,
);
在遊樂場中開啟[1, 2, 3].reduce<number[]>((arr, num) => arr.concat(num * 2), []);
['a', 'b'].reduce<Record<string, boolean>>(
(accum, name) => ({
...accum,
[name]: true,
}),
{},
);
在遊樂場中開啟選項
此規則無從設定。
不應使用的時機
使用 .reduce
建立物件時,此規則有時難以變通。請參閱 [prefer-reduce-type-parameter] 無法修正的回報 #3440 以進一步了解資訊。您可以考慮使用 ESLint 禁用註解 處理那些特定情況,而不是完全停用這項規則。
類型檢查的 linting 規則比傳統的 linting 規則強大,但也需要設定 類型檢查的 linting。啟用類型檢查規則後,如果您遇到效能降低,請參閱 效能疑難排解。