no-foreach
Disallow calling forEach on configured collection types.
Targeted pattern scope
⚠️ This rule requires type information to run. Configure type-aware linting
(parserOptions.project or projectService) before enabling it.
This rule targets member calls to .forEach(...) and reports only when the
receiver type matches configured collection names.
What this rule reports
This rule reports .forEach(...) calls for configured type names (by default: Array, Map, NodeList, and Set). In codebases that standardize on explicit loops, for...of improves control-flow clarity (for example, with break, continue, and return).
Why this rule exists
Teams that standardize on explicit loops often prefer for...of for control
flow clarity (break, continue, early return) and debugger ergonomics.
❌ Incorrect
const answers = [42, 54];
answers.forEach((answer) => console.log(answer));
✅ Correct
const answers = [42, 54];
for (const answer of answers) {
console.log(answer);
}
Behavior and migration notes
This rule reports only and does not provide an autofix.
Adopt gradually by enabling as warn, then migrating hot paths and shared
utilities to for...of before promoting to error.
Options
type Options = {
types?: string[];
};
Default: { types: ["Array", "Map", "NodeList", "Set"] }
When Array is included, ReadonlyArray is also treated as matched.
types
Use this option to control which type names are checked.
Additional examples
const set = new Set([
1,
2,
3,
]);
set.forEach((value) => console.log(value));
// ❌ reported with default options
const map = new Map<string, number>();
for (const [key, value] of map) {
console.log(key, value);
}
// ✅ preferred style
ESLint flat config example
import etcMisc from "eslint-plugin-etc-misc";
export default [
{
plugins: { "etc-misc": etcMisc },
rules: {
"etc-misc/no-foreach": ["error", { types: ["Array", "Set"] }],
},
},
];
When not to use it
Disable this rule if your project intentionally favors iterator callbacks and does not enforce loop-style consistency.
Package documentation
Rule catalog ID: R025
Further reading
Adoption resources
- Start at warning level in CI, then move to error after cleanup.
- Use focused codemods/autofix batches per package or directory.