Skip to main content

no-for-in-array

Disallow iterating over an array with a for-in loop.

💭

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


for-in 循环 (for (const i in o)) 迭代对象的属性。 虽然对数组值使用 for-in 循环是合法的,但并不常见。 这有几个潜在的错误:

英:A for-in loop (for (const i in o)) iterates over the properties of an Object. While it is legal to use for-in loops with array values, it is not common. There are several potential bugs with this:

  1. 它迭代所有可枚举属性,包括非索引属性和整个原型链。 例如,RegExp.prototype.exec 返回一个带有附加属性的数组,for-in 将迭代它们。 某些库甚至你自己的代码可能会向 Array.prototype 添加其他方法(作为 polyfill 或自定义方法),如果做得不正确,它们也可能会被迭代。
  2. 它会跳过数组中的漏洞。 虽然稀疏数组很少见并且不建议使用,但它们仍然是可能的,并且你的代码应该能够处理它们。
  3. "index" 作为字符串而不是数字返回。 这可以被 TypeScript 捕获,但仍然可能导致微妙的错误。

你可能混淆了 for-in 和 for-of,后者迭代数组的元素。 如果你确实需要索引,请使用常规 for 循环或 forEach 方法。

英:You may have confused for-in with for-of, which iterates over the elements of the array. If you actually need the index, use a regular for loop or the forEach method.

.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]);
}
Open in Playground

何时不使用它

如果你的项目是一个罕见的故意循环数组字符串索引的项目,你可以关闭此规则。 你可以考虑在这些特定情况下使用 ESLint 禁用注释,而不是完全禁用此规则。

英:If your project is a rare one that intentionally loops over string indices of arrays, you can turn off this rule. You might consider using ESLint disable comments for those specific situations instead of completely disabling this rule.

选项

该规则不可配置。

资源