diff --git a/packages/eslint-plugin/src/rules/explicit-module-boundary-types.ts b/packages/eslint-plugin/src/rules/explicit-module-boundary-types.ts index 5671e36dbdd..f4c73ef0d9b 100644 --- a/packages/eslint-plugin/src/rules/explicit-module-boundary-types.ts +++ b/packages/eslint-plugin/src/rules/explicit-module-boundary-types.ts @@ -96,6 +96,10 @@ export default util.createRule({ // tracks functions that were found whilst traversing const foundFunctions: FunctionNode[] = []; + // all nodes visited, avoids infinite recursion for cyclic references + // (such as class member referring to itself) + const alreadyVisited = new Set(); + /* # How the rule works: @@ -311,9 +315,10 @@ export default util.createRule({ } function checkNode(node: TSESTree.Node | null): void { - if (node == null) { + if (node == null || alreadyVisited.has(node)) { return; } + alreadyVisited.add(node); switch (node.type) { case AST_NODE_TYPES.ArrowFunctionExpression: diff --git a/packages/eslint-plugin/tests/rules/explicit-module-boundary-types.test.ts b/packages/eslint-plugin/tests/rules/explicit-module-boundary-types.test.ts index c79cc34a314..25b70794843 100644 --- a/packages/eslint-plugin/tests/rules/explicit-module-boundary-types.test.ts +++ b/packages/eslint-plugin/tests/rules/explicit-module-boundary-types.test.ts @@ -654,6 +654,11 @@ export abstract class Foo { ` export declare class Foo { set time(seconds: number); +} + `, + ` +export class A { + b = A; } `, ],