diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index e52b8f5d360..f9a00397a7a 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -45805,7 +45805,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { hasAbstractModifier(member), isStatic(member), memberIsParameterProperty, - symbolName(declaredProp), + declaredProp, reportErrors ? member : undefined, ); } @@ -45829,22 +45829,21 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { memberHasAbstractModifier: boolean, memberIsStatic: boolean, memberIsParameterProperty: boolean, - memberName: string, + member: Symbol, errorNode?: Node, ): MemberOverrideStatus { const isJs = isInJSFile(node); const nodeInAmbientContext = !!(node.flags & NodeFlags.Ambient); if (baseWithThis && (memberHasOverrideModifier || compilerOptions.noImplicitOverride)) { - const memberEscapedName = escapeLeadingUnderscores(memberName); const thisType = memberIsStatic ? staticType : typeWithThis; const baseType = memberIsStatic ? baseStaticType : baseWithThis; - const prop = getPropertyOfType(thisType, memberEscapedName); - const baseProp = getPropertyOfType(baseType, memberEscapedName); + const prop = getPropertyOfType(thisType, member.escapedName); + const baseProp = getPropertyOfType(baseType, member.escapedName); const baseClassName = typeToString(baseWithThis); if (prop && !baseProp && memberHasOverrideModifier) { if (errorNode) { - const suggestion = getSuggestedSymbolForNonexistentClassMember(memberName, baseType); // Again, using symbol name: note that's different from `symbol.escapedName` + const suggestion = getSuggestedSymbolForNonexistentClassMember(symbolName(member), baseType); // Again, using symbol name: note that's different from `symbol.escapedName` suggestion ? error( errorNode, @@ -45990,7 +45989,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { hasAbstractModifier(member), isStatic(member), /*memberIsParameterProperty*/ false, - symbolName(memberSymbol), + memberSymbol, ); } diff --git a/tests/baselines/reference/override21.errors.txt b/tests/baselines/reference/override21.errors.txt new file mode 100644 index 00000000000..325cd0999ad --- /dev/null +++ b/tests/baselines/reference/override21.errors.txt @@ -0,0 +1,13 @@ +override21.ts(5,14): error TS4113: This member cannot have an 'override' modifier because it is not declared in the base class 'A'. + + +==== override21.ts (1 errors) ==== + const foo = Symbol(); + class A { } + + class B extends A { + override [foo]() { } + ~~~~~ +!!! error TS4113: This member cannot have an 'override' modifier because it is not declared in the base class 'A'. + } + \ No newline at end of file diff --git a/tests/baselines/reference/override21.js b/tests/baselines/reference/override21.js new file mode 100644 index 00000000000..b05305c38a5 --- /dev/null +++ b/tests/baselines/reference/override21.js @@ -0,0 +1,18 @@ +//// [tests/cases/conformance/override/override21.ts] //// + +//// [override21.ts] +const foo = Symbol(); +class A { } + +class B extends A { + override [foo]() { } +} + + +//// [override21.js] +const foo = Symbol(); +class A { +} +class B extends A { + [foo]() { } +} diff --git a/tests/baselines/reference/override21.symbols b/tests/baselines/reference/override21.symbols new file mode 100644 index 00000000000..374510196b9 --- /dev/null +++ b/tests/baselines/reference/override21.symbols @@ -0,0 +1,19 @@ +//// [tests/cases/conformance/override/override21.ts] //// + +=== override21.ts === +const foo = Symbol(); +>foo : Symbol(foo, Decl(override21.ts, 0, 5)) +>Symbol : Symbol(Symbol, Decl(lib.es5.d.ts, --, --), Decl(lib.es2015.symbol.d.ts, --, --), Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2019.symbol.d.ts, --, --)) + +class A { } +>A : Symbol(A, Decl(override21.ts, 0, 21)) + +class B extends A { +>B : Symbol(B, Decl(override21.ts, 1, 11)) +>A : Symbol(A, Decl(override21.ts, 0, 21)) + + override [foo]() { } +>[foo] : Symbol(B[foo], Decl(override21.ts, 3, 19)) +>foo : Symbol(foo, Decl(override21.ts, 0, 5)) +} + diff --git a/tests/baselines/reference/override21.types b/tests/baselines/reference/override21.types new file mode 100644 index 00000000000..c4046451af5 --- /dev/null +++ b/tests/baselines/reference/override21.types @@ -0,0 +1,20 @@ +//// [tests/cases/conformance/override/override21.ts] //// + +=== override21.ts === +const foo = Symbol(); +>foo : unique symbol +>Symbol() : unique symbol +>Symbol : SymbolConstructor + +class A { } +>A : A + +class B extends A { +>B : B +>A : A + + override [foo]() { } +>[foo] : () => void +>foo : unique symbol +} + diff --git a/tests/cases/conformance/override/override21.ts b/tests/cases/conformance/override/override21.ts new file mode 100644 index 00000000000..1ae27447a6d --- /dev/null +++ b/tests/cases/conformance/override/override21.ts @@ -0,0 +1,9 @@ +// @target: esnext +// @noImplicitOverride: true + +const foo = Symbol(); +class A { } + +class B extends A { + override [foo]() { } +}