禁止在数组上使用 for...in 循环
禁止使用 for-in 循环遍历数组。
✅
在 "plugin:@typescript-eslint/recommended-type-checked"
中扩展 ESLint 配置 将启用此规则。
💭
此规则需要 类型信息 才能运行。
for-in 循环 (for (const i in o)
) 遍历对象的属性。虽然使用 for-in 循环遍历数组值是合法的,但并不常见。这种方法存在一些潜在的错误
- 它遍历所有可枚举属性,包括非索引属性和整个原型链。例如,
RegExp.prototype.exec
返回一个带有附加属性的数组,而for-in
将遍历这些属性。一些库甚至您自己的代码可能会向Array.prototype
添加额外的函数(作为 polyfill 或自定义函数),如果不正确处理,它们也可能会被遍历。 - 它会跳过数组中的空洞。虽然稀疏数组很少见,也不建议使用,但它们仍然可能存在,您的代码应该能够处理它们。
- “索引”以字符串形式返回,而不是数字。TypeScript 可以捕获这种情况,但仍然会导致细微的错误。
您可能将 for-in 与 for-of 混淆了,for-of 遍历数组的元素。如果您确实需要索引,请使用常规的 for
循环或 forEach
函数。
.eslintrc.cjs
module.exports = {
"rules": {
"@typescript-eslint/no-for-in-array": "error"
}
};
在游乐场中尝试此规则 ↗
示例
- ❌ 错误
- ✅ 正确
declare const array: string[];
for (const i in array) {
console.log(array[i]);
}
for (const i in array) {
console.log(i, array[i]);
}
在游乐场中打开declare const array: string[];
for (const value of array) {
console.log(value);
}
for (let i = 0; i < array.length; i += 1) {
console.log(i, array[i]);
}
array.forEach((value, i) => {
console.log(i, value);
});
for (const [i, value] of array.entries()) {
console.log(i, value);
}
在游乐场中打开选项
此规则不可配置。
何时不使用它
如果您的项目是一个罕见的项目,有意地循环遍历数组的字符串索引,您可以关闭此规则。您可以考虑使用 ESLint 禁用注释 来处理这些特定情况,而不是完全禁用此规则。
类型检查的 lint 规则比传统的 lint 规则更强大,但也需要配置 类型检查的 lint。如果您在启用类型检查规则后遇到性能下降,请参阅 性能故障排除。