fix(57141): override keyword doesn't check symbol-key class members (#57146)

This commit is contained in:
Oleksandr T 2024-06-13 02:25:06 +03:00 committed by GitHub
parent 1948e92e3a
commit 4ada2706a7
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 85 additions and 7 deletions

View File

@ -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,
);
}

View File

@ -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'.
}

View File

@ -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]() { }
}

View File

@ -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))
}

View File

@ -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
}

View File

@ -0,0 +1,9 @@
// @target: esnext
// @noImplicitOverride: true
const foo = Symbol();
class A { }
class B extends A {
override [foo]() { }
}