mirror of
https://github.com/microsoft/TypeScript.git
synced 2026-02-04 21:19:30 -06:00
fix(57141): override keyword doesn't check symbol-key class members (#57146)
This commit is contained in:
parent
1948e92e3a
commit
4ada2706a7
@ -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,
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
13
tests/baselines/reference/override21.errors.txt
Normal file
13
tests/baselines/reference/override21.errors.txt
Normal 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'.
|
||||
}
|
||||
|
||||
18
tests/baselines/reference/override21.js
Normal file
18
tests/baselines/reference/override21.js
Normal 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]() { }
|
||||
}
|
||||
19
tests/baselines/reference/override21.symbols
Normal file
19
tests/baselines/reference/override21.symbols
Normal 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))
|
||||
}
|
||||
|
||||
20
tests/baselines/reference/override21.types
Normal file
20
tests/baselines/reference/override21.types
Normal 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
|
||||
}
|
||||
|
||||
9
tests/cases/conformance/override/override21.ts
Normal file
9
tests/cases/conformance/override/override21.ts
Normal file
@ -0,0 +1,9 @@
|
||||
// @target: esnext
|
||||
// @noImplicitOverride: true
|
||||
|
||||
const foo = Symbol();
|
||||
class A { }
|
||||
|
||||
class B extends A {
|
||||
override [foo]() { }
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user