优先使用 reduce 类型参数
强制在调用
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 禁用注释 来处理这些特定情况,而不是完全禁用此规则。
类型检查的 lint 规则比传统的 lint 规则更强大,但也需要配置 类型检查的 lint。如果您在启用类型检查规则后遇到性能下降,请参阅 性能故障排除。