diff --git a/packages/eslint-plugin/src/rules/prefer-readonly.ts b/packages/eslint-plugin/src/rules/prefer-readonly.ts index 19597264bbc..816a79371fb 100644 --- a/packages/eslint-plugin/src/rules/prefer-readonly.ts +++ b/packages/eslint-plugin/src/rules/prefer-readonly.ts @@ -270,8 +270,12 @@ class ClassScope { classNode: ts.ClassLikeDeclaration, private readonly onlyInlineLambdas?: boolean, ) { - this.checker = checker; - this.classType = checker.getTypeAtLocation(classNode); + const classType = checker.getTypeAtLocation(classNode); + if (tsutils.isIntersectionType(classType)) { + this.classType = classType.types[0]; + } else { + this.classType = classType; + } for (const member of classNode.members) { if (ts.isPropertyDeclaration(member)) { diff --git a/packages/eslint-plugin/tests/rules/prefer-readonly.test.ts b/packages/eslint-plugin/tests/rules/prefer-readonly.test.ts index c1602f01913..91e8213da57 100644 --- a/packages/eslint-plugin/tests/rules/prefer-readonly.test.ts +++ b/packages/eslint-plugin/tests/rules/prefer-readonly.test.ts @@ -292,6 +292,19 @@ class Foo { }, { code: ` +function ClassWithName {}>(Base: TBase) { + return class extends Base { + private _name: string; + + public test(value: string) { + this._name = value; + } + }; +} + `, + }, + { + code: ` class Foo { private value: Record = {}; @@ -704,5 +717,30 @@ class Foo { } `, }, + { + code: ` +function ClassWithName {}>(Base: TBase) { + return class extends Base { + private _name: string; + }; +} + `, + output: ` +function ClassWithName {}>(Base: TBase) { + return class extends Base { + private readonly _name: string; + }; +} + `, + errors: [ + { + data: { + name: '_name', + }, + line: 4, + messageId: 'preferReadonly', + }, + ], + }, ], });