跳至主要內容

no-for-in-array

禁止使用 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"
}
};

在 Playground 中試用此規則 ↗

範例

declare const array: string[];

for (const i in array) {
console.log(array[i]);
}

for (const i in array) {
console.log(i, array[i]);
}
在 Playground 中開啟

選項

此規則不可配置。

何時不使用

如果你的專案是一個罕見的專案,有意迴圈陣列的字串索引,你可以關閉此規則。你可能會考慮使用 ESLint 禁用註釋 來處理這些特定情況,而不是完全禁用此規則。


類型檢查的 lint 規則比傳統的 lint 規則更強大,但也需要配置 類型檢查的 linting。如果你在啟用類型檢查規則後遇到效能下降的問題,請參閱 效能疑難排解

資源