no-for-in-array
禁止使用 for-in 迴圈迭代陣列。
💭
此規則需要 類型資訊 才能執行。
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"
}
};
在 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 中開啟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);
}
在 Playground 中開啟選項
此規則不可配置。
何時不使用
如果你的專案是一個罕見的專案,有意迴圈陣列的字串索引,你可以關閉此規則。你可能會考慮使用 ESLint 禁用註釋 來處理這些特定情況,而不是完全禁用此規則。
類型檢查的 lint 規則比傳統的 lint 規則更強大,但也需要配置 類型檢查的 linting。如果你在啟用類型檢查規則後遇到效能下降的問題,請參閱 效能疑難排解。