Skip to content

Commit 4ada270

Browse files
authored
fix(57141): override keyword doesn't check symbol-key class members (#57146)
1 parent 1948e92 commit 4ada270

File tree

6 files changed

+85
-7
lines changed

6 files changed

+85
-7
lines changed

src/compiler/checker.ts

+6-7
Original file line numberDiff line numberDiff line change
@@ -45805,7 +45805,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
4580545805
hasAbstractModifier(member),
4580645806
isStatic(member),
4580745807
memberIsParameterProperty,
45808-
symbolName(declaredProp),
45808+
declaredProp,
4580945809
reportErrors ? member : undefined,
4581045810
);
4581145811
}
@@ -45829,22 +45829,21 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
4582945829
memberHasAbstractModifier: boolean,
4583045830
memberIsStatic: boolean,
4583145831
memberIsParameterProperty: boolean,
45832-
memberName: string,
45832+
member: Symbol,
4583345833
errorNode?: Node,
4583445834
): MemberOverrideStatus {
4583545835
const isJs = isInJSFile(node);
4583645836
const nodeInAmbientContext = !!(node.flags & NodeFlags.Ambient);
4583745837
if (baseWithThis && (memberHasOverrideModifier || compilerOptions.noImplicitOverride)) {
45838-
const memberEscapedName = escapeLeadingUnderscores(memberName);
4583945838
const thisType = memberIsStatic ? staticType : typeWithThis;
4584045839
const baseType = memberIsStatic ? baseStaticType : baseWithThis;
45841-
const prop = getPropertyOfType(thisType, memberEscapedName);
45842-
const baseProp = getPropertyOfType(baseType, memberEscapedName);
45840+
const prop = getPropertyOfType(thisType, member.escapedName);
45841+
const baseProp = getPropertyOfType(baseType, member.escapedName);
4584345842

4584445843
const baseClassName = typeToString(baseWithThis);
4584545844
if (prop && !baseProp && memberHasOverrideModifier) {
4584645845
if (errorNode) {
45847-
const suggestion = getSuggestedSymbolForNonexistentClassMember(memberName, baseType); // Again, using symbol name: note that's different from `symbol.escapedName`
45846+
const suggestion = getSuggestedSymbolForNonexistentClassMember(symbolName(member), baseType); // Again, using symbol name: note that's different from `symbol.escapedName`
4584845847
suggestion ?
4584945848
error(
4585045849
errorNode,
@@ -45990,7 +45989,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
4599045989
hasAbstractModifier(member),
4599145990
isStatic(member),
4599245991
/*memberIsParameterProperty*/ false,
45993-
symbolName(memberSymbol),
45992+
memberSymbol,
4599445993
);
4599545994
}
4599645995

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
override21.ts(5,14): error TS4113: This member cannot have an 'override' modifier because it is not declared in the base class 'A'.
2+
3+
4+
==== override21.ts (1 errors) ====
5+
const foo = Symbol();
6+
class A { }
7+
8+
class B extends A {
9+
override [foo]() { }
10+
~~~~~
11+
!!! error TS4113: This member cannot have an 'override' modifier because it is not declared in the base class 'A'.
12+
}
13+
+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
//// [tests/cases/conformance/override/override21.ts] ////
2+
3+
//// [override21.ts]
4+
const foo = Symbol();
5+
class A { }
6+
7+
class B extends A {
8+
override [foo]() { }
9+
}
10+
11+
12+
//// [override21.js]
13+
const foo = Symbol();
14+
class A {
15+
}
16+
class B extends A {
17+
[foo]() { }
18+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
//// [tests/cases/conformance/override/override21.ts] ////
2+
3+
=== override21.ts ===
4+
const foo = Symbol();
5+
>foo : Symbol(foo, Decl(override21.ts, 0, 5))
6+
>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, --, --))
7+
8+
class A { }
9+
>A : Symbol(A, Decl(override21.ts, 0, 21))
10+
11+
class B extends A {
12+
>B : Symbol(B, Decl(override21.ts, 1, 11))
13+
>A : Symbol(A, Decl(override21.ts, 0, 21))
14+
15+
override [foo]() { }
16+
>[foo] : Symbol(B[foo], Decl(override21.ts, 3, 19))
17+
>foo : Symbol(foo, Decl(override21.ts, 0, 5))
18+
}
19+
+20
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
//// [tests/cases/conformance/override/override21.ts] ////
2+
3+
=== override21.ts ===
4+
const foo = Symbol();
5+
>foo : unique symbol
6+
>Symbol() : unique symbol
7+
>Symbol : SymbolConstructor
8+
9+
class A { }
10+
>A : A
11+
12+
class B extends A {
13+
>B : B
14+
>A : A
15+
16+
override [foo]() { }
17+
>[foo] : () => void
18+
>foo : unique symbol
19+
}
20+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
// @target: esnext
2+
// @noImplicitOverride: true
3+
4+
const foo = Symbol();
5+
class A { }
6+
7+
class B extends A {
8+
override [foo]() { }
9+
}

0 commit comments

Comments
 (0)