跳至主要内容

禁止在数组上使用 for...in 循环

禁止使用 for-in 循环遍历数组。

💭

此规则需要 类型信息 才能运行。

for-in 循环 (for (const i in o)) 遍历对象的属性。虽然使用 for-in 循环遍历数组值是合法的,但并不常见。这种方法存在一些潜在的错误

  1. 它遍历所有可枚举属性,包括非索引属性和整个原型链。例如,RegExp.prototype.exec 返回一个带有附加属性的数组,而 for-in 将遍历这些属性。一些库甚至您自己的代码可能会向 Array.prototype 添加额外的函数(作为 polyfill 或自定义函数),如果不正确处理,它们也可能会被遍历。
  2. 它会跳过数组中的空洞。虽然稀疏数组很少见,也不建议使用,但它们仍然可能存在,您的代码应该能够处理它们。
  3. “索引”以字符串形式返回,而不是数字。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]);
}
在游乐场中打开

选项

此规则不可配置。

何时不使用它

如果您的项目是一个罕见的项目,有意地循环遍历数组的字符串索引,您可以关闭此规则。您可以考虑使用 ESLint 禁用注释 来处理这些特定情况,而不是完全禁用此规则。


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

资源