跳至主要内容

优先使用 reduce 类型参数

强制在调用 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 禁用注释 来处理这些特定情况,而不是完全禁用此规则。


类型检查的 lint 规则比传统的 lint 规则更强大,但也需要配置 类型检查的 lint。如果您在启用类型检查规则后遇到性能下降,请参阅 性能故障排除

资源