no-for-in-array
for-inループで配列を反復処理することを禁止します。
✅
拡張 "plugin:@typescript-eslint/recommended-type-checked"
を ESLint設定 に追加すると、このルールが有効になります。
💭
このルールを実行するには 型情報 が必要です。
for-inループ(`for (const i in o)`)は、オブジェクトのプロパティを反復処理します。配列値に対してfor-inループを使用することは合法ですが、一般的ではありません。これにはいくつかの潜在的なバグがあります。
- これは、インデックス以外の非enumerableプロパティやプロトタイプチェーン全体を含む、すべてのenumerableプロパティを反復処理します。たとえば、`RegExp.prototype.exec`は追加のプロパティを持つ配列を返し、`for-in`はそれらを反復処理します。一部のライブラリ、または独自のコードで`Array.prototype`に追加メソッド(ポリフィルまたはカスタムメソッドとして)を追加する場合があり、適切に処理されない場合、それらも反復処理される可能性があります。
- 配列の空いている要素をスキップします。疎な配列はまれで推奨されていませんが、それでも可能であり、コードはそれらを処理できる必要があります。
- "インデックス"は数値ではなく文字列として返されます。これは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の設定も必要です。型チェックされたルールを有効にした後にパフォーマンスの低下が発生する場合は、パフォーマンスのトラブルシューティングを参照してください。