Error on override used on dynamically named class members (#60691)

This commit is contained in:
Mateusz Burzyński
2024-12-06 20:05:25 +01:00
committed by GitHub
parent edd278a104
commit 239a2a936f
29 changed files with 1358 additions and 0 deletions

View File

@@ -46774,6 +46774,15 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
): MemberOverrideStatus {
const isJs = isInJSFile(node);
const nodeInAmbientContext = !!(node.flags & NodeFlags.Ambient);
if (memberHasOverrideModifier && member?.valueDeclaration && isClassElement(member.valueDeclaration) && member.valueDeclaration.name && isNonBindableDynamicName(member.valueDeclaration.name)) {
error(
errorNode,
isJs ?
Diagnostics.This_member_cannot_have_a_JSDoc_comment_with_an_override_tag_because_its_name_is_dynamic :
Diagnostics.This_member_cannot_have_an_override_modifier_because_its_name_is_dynamic,
);
return MemberOverrideStatus.HasInvalidOverride;
}
if (baseWithThis && (memberHasOverrideModifier || compilerOptions.noImplicitOverride)) {
const thisType = memberIsStatic ? staticType : typeWithThis;
const baseType = memberIsStatic ? baseStaticType : baseWithThis;

View File

@@ -4417,6 +4417,14 @@
"category": "Error",
"code": 4126
},
"This member cannot have an 'override' modifier because its name is dynamic.": {
"category": "Error",
"code": 4127
},
"This member cannot have a JSDoc comment with an '@override' tag because its name is dynamic.": {
"category": "Error",
"code": 4128
},
"The current host does not support the '{0}' option.": {
"category": "Error",

View File

@@ -0,0 +1,33 @@
overrideDynamicName1.ts(8,12): error TS4127: This member cannot have an 'override' modifier because its name is dynamic.
overrideDynamicName1.ts(22,12): error TS4127: This member cannot have an 'override' modifier because its name is dynamic.
==== overrideDynamicName1.ts (2 errors) ====
let prop = "foo"
class Base1 {
[prop]() {}
}
class Derived1 extends Base1 {
override [prop]() {}
~~~~~~
!!! error TS4127: This member cannot have an 'override' modifier because its name is dynamic.
}
class Base2 {
[prop]() {}
}
class Derived2 extends Base2 {
[prop]() {}
}
class Base3 {}
class Derived3 extends Base3 {
override [prop]() {}
~~~~~~
!!! error TS4127: This member cannot have an 'override' modifier because its name is dynamic.
}

View File

@@ -0,0 +1,49 @@
//// [tests/cases/conformance/override/overrideDynamicName1.ts] ////
//// [overrideDynamicName1.ts]
let prop = "foo"
class Base1 {
[prop]() {}
}
class Derived1 extends Base1 {
override [prop]() {}
}
class Base2 {
[prop]() {}
}
class Derived2 extends Base2 {
[prop]() {}
}
class Base3 {}
class Derived3 extends Base3 {
override [prop]() {}
}
//// [overrideDynamicName1.d.ts]
declare let prop: string;
declare class Base1 {
[x: string]: () => void;
}
declare class Derived1 extends Base1 {
[x: string]: () => void;
}
declare class Base2 {
[x: string]: () => void;
}
declare class Derived2 extends Base2 {
[x: string]: () => void;
}
declare class Base3 {
}
declare class Derived3 extends Base3 {
[x: string]: () => void;
}

View File

@@ -0,0 +1,52 @@
//// [tests/cases/conformance/override/overrideDynamicName1.ts] ////
=== overrideDynamicName1.ts ===
let prop = "foo"
>prop : Symbol(prop, Decl(overrideDynamicName1.ts, 0, 3))
class Base1 {
>Base1 : Symbol(Base1, Decl(overrideDynamicName1.ts, 0, 16))
[prop]() {}
>[prop] : Symbol(Base1[prop], Decl(overrideDynamicName1.ts, 2, 13))
>prop : Symbol(prop, Decl(overrideDynamicName1.ts, 0, 3))
}
class Derived1 extends Base1 {
>Derived1 : Symbol(Derived1, Decl(overrideDynamicName1.ts, 4, 1))
>Base1 : Symbol(Base1, Decl(overrideDynamicName1.ts, 0, 16))
override [prop]() {}
>[prop] : Symbol(Derived1[prop], Decl(overrideDynamicName1.ts, 6, 30))
>prop : Symbol(prop, Decl(overrideDynamicName1.ts, 0, 3))
}
class Base2 {
>Base2 : Symbol(Base2, Decl(overrideDynamicName1.ts, 8, 1))
[prop]() {}
>[prop] : Symbol(Base2[prop], Decl(overrideDynamicName1.ts, 10, 13))
>prop : Symbol(prop, Decl(overrideDynamicName1.ts, 0, 3))
}
class Derived2 extends Base2 {
>Derived2 : Symbol(Derived2, Decl(overrideDynamicName1.ts, 12, 1))
>Base2 : Symbol(Base2, Decl(overrideDynamicName1.ts, 8, 1))
[prop]() {}
>[prop] : Symbol(Derived2[prop], Decl(overrideDynamicName1.ts, 14, 30))
>prop : Symbol(prop, Decl(overrideDynamicName1.ts, 0, 3))
}
class Base3 {}
>Base3 : Symbol(Base3, Decl(overrideDynamicName1.ts, 16, 1))
class Derived3 extends Base3 {
>Derived3 : Symbol(Derived3, Decl(overrideDynamicName1.ts, 18, 14))
>Base3 : Symbol(Base3, Decl(overrideDynamicName1.ts, 16, 1))
override [prop]() {}
>[prop] : Symbol(Derived3[prop], Decl(overrideDynamicName1.ts, 20, 30))
>prop : Symbol(prop, Decl(overrideDynamicName1.ts, 0, 3))
}

View File

@@ -0,0 +1,74 @@
//// [tests/cases/conformance/override/overrideDynamicName1.ts] ////
=== overrideDynamicName1.ts ===
let prop = "foo"
>prop : string
> : ^^^^^^
>"foo" : "foo"
> : ^^^^^
class Base1 {
>Base1 : Base1
> : ^^^^^
[prop]() {}
>[prop] : () => void
> : ^^^^^^^^^^
>prop : string
> : ^^^^^^
}
class Derived1 extends Base1 {
>Derived1 : Derived1
> : ^^^^^^^^
>Base1 : Base1
> : ^^^^^
override [prop]() {}
>[prop] : () => void
> : ^^^^^^^^^^
>prop : string
> : ^^^^^^
}
class Base2 {
>Base2 : Base2
> : ^^^^^
[prop]() {}
>[prop] : () => void
> : ^^^^^^^^^^
>prop : string
> : ^^^^^^
}
class Derived2 extends Base2 {
>Derived2 : Derived2
> : ^^^^^^^^
>Base2 : Base2
> : ^^^^^
[prop]() {}
>[prop] : () => void
> : ^^^^^^^^^^
>prop : string
> : ^^^^^^
}
class Base3 {}
>Base3 : Base3
> : ^^^^^
class Derived3 extends Base3 {
>Derived3 : Derived3
> : ^^^^^^^^
>Base3 : Base3
> : ^^^^^
override [prop]() {}
>[prop] : () => void
> : ^^^^^^^^^^
>prop : string
> : ^^^^^^
}

View File

@@ -0,0 +1,33 @@
overrideDynamicName1.ts(8,12): error TS4127: This member cannot have an 'override' modifier because its name is dynamic.
overrideDynamicName1.ts(22,12): error TS4127: This member cannot have an 'override' modifier because its name is dynamic.
==== overrideDynamicName1.ts (2 errors) ====
let prop = "foo"
class Base1 {
[prop]() {}
}
class Derived1 extends Base1 {
override [prop]() {}
~~~~~~
!!! error TS4127: This member cannot have an 'override' modifier because its name is dynamic.
}
class Base2 {
[prop]() {}
}
class Derived2 extends Base2 {
[prop]() {}
}
class Base3 {}
class Derived3 extends Base3 {
override [prop]() {}
~~~~~~
!!! error TS4127: This member cannot have an 'override' modifier because its name is dynamic.
}

View File

@@ -0,0 +1,49 @@
//// [tests/cases/conformance/override/overrideDynamicName1.ts] ////
//// [overrideDynamicName1.ts]
let prop = "foo"
class Base1 {
[prop]() {}
}
class Derived1 extends Base1 {
override [prop]() {}
}
class Base2 {
[prop]() {}
}
class Derived2 extends Base2 {
[prop]() {}
}
class Base3 {}
class Derived3 extends Base3 {
override [prop]() {}
}
//// [overrideDynamicName1.d.ts]
declare let prop: string;
declare class Base1 {
[x: string]: () => void;
}
declare class Derived1 extends Base1 {
[x: string]: () => void;
}
declare class Base2 {
[x: string]: () => void;
}
declare class Derived2 extends Base2 {
[x: string]: () => void;
}
declare class Base3 {
}
declare class Derived3 extends Base3 {
[x: string]: () => void;
}

View File

@@ -0,0 +1,52 @@
//// [tests/cases/conformance/override/overrideDynamicName1.ts] ////
=== overrideDynamicName1.ts ===
let prop = "foo"
>prop : Symbol(prop, Decl(overrideDynamicName1.ts, 0, 3))
class Base1 {
>Base1 : Symbol(Base1, Decl(overrideDynamicName1.ts, 0, 16))
[prop]() {}
>[prop] : Symbol(Base1[prop], Decl(overrideDynamicName1.ts, 2, 13))
>prop : Symbol(prop, Decl(overrideDynamicName1.ts, 0, 3))
}
class Derived1 extends Base1 {
>Derived1 : Symbol(Derived1, Decl(overrideDynamicName1.ts, 4, 1))
>Base1 : Symbol(Base1, Decl(overrideDynamicName1.ts, 0, 16))
override [prop]() {}
>[prop] : Symbol(Derived1[prop], Decl(overrideDynamicName1.ts, 6, 30))
>prop : Symbol(prop, Decl(overrideDynamicName1.ts, 0, 3))
}
class Base2 {
>Base2 : Symbol(Base2, Decl(overrideDynamicName1.ts, 8, 1))
[prop]() {}
>[prop] : Symbol(Base2[prop], Decl(overrideDynamicName1.ts, 10, 13))
>prop : Symbol(prop, Decl(overrideDynamicName1.ts, 0, 3))
}
class Derived2 extends Base2 {
>Derived2 : Symbol(Derived2, Decl(overrideDynamicName1.ts, 12, 1))
>Base2 : Symbol(Base2, Decl(overrideDynamicName1.ts, 8, 1))
[prop]() {}
>[prop] : Symbol(Derived2[prop], Decl(overrideDynamicName1.ts, 14, 30))
>prop : Symbol(prop, Decl(overrideDynamicName1.ts, 0, 3))
}
class Base3 {}
>Base3 : Symbol(Base3, Decl(overrideDynamicName1.ts, 16, 1))
class Derived3 extends Base3 {
>Derived3 : Symbol(Derived3, Decl(overrideDynamicName1.ts, 18, 14))
>Base3 : Symbol(Base3, Decl(overrideDynamicName1.ts, 16, 1))
override [prop]() {}
>[prop] : Symbol(Derived3[prop], Decl(overrideDynamicName1.ts, 20, 30))
>prop : Symbol(prop, Decl(overrideDynamicName1.ts, 0, 3))
}

View File

@@ -0,0 +1,74 @@
//// [tests/cases/conformance/override/overrideDynamicName1.ts] ////
=== overrideDynamicName1.ts ===
let prop = "foo"
>prop : string
> : ^^^^^^
>"foo" : "foo"
> : ^^^^^
class Base1 {
>Base1 : Base1
> : ^^^^^
[prop]() {}
>[prop] : () => void
> : ^^^^^^^^^^
>prop : string
> : ^^^^^^
}
class Derived1 extends Base1 {
>Derived1 : Derived1
> : ^^^^^^^^
>Base1 : Base1
> : ^^^^^
override [prop]() {}
>[prop] : () => void
> : ^^^^^^^^^^
>prop : string
> : ^^^^^^
}
class Base2 {
>Base2 : Base2
> : ^^^^^
[prop]() {}
>[prop] : () => void
> : ^^^^^^^^^^
>prop : string
> : ^^^^^^
}
class Derived2 extends Base2 {
>Derived2 : Derived2
> : ^^^^^^^^
>Base2 : Base2
> : ^^^^^
[prop]() {}
>[prop] : () => void
> : ^^^^^^^^^^
>prop : string
> : ^^^^^^
}
class Base3 {}
>Base3 : Base3
> : ^^^^^
class Derived3 extends Base3 {
>Derived3 : Derived3
> : ^^^^^^^^
>Base3 : Base3
> : ^^^^^
override [prop]() {}
>[prop] : () => void
> : ^^^^^^^^^^
>prop : string
> : ^^^^^^
}

View File

@@ -0,0 +1,33 @@
overrideLateBindableIndexSignature1.ts(8,12): error TS4127: This member cannot have an 'override' modifier because its name is dynamic.
overrideLateBindableIndexSignature1.ts(22,12): error TS4127: This member cannot have an 'override' modifier because its name is dynamic.
==== overrideLateBindableIndexSignature1.ts (2 errors) ====
const sym: symbol = Symbol();
class Base1 {
[sym]() {}
}
class Derived1 extends Base1 {
override [sym]() {}
~~~~~
!!! error TS4127: This member cannot have an 'override' modifier because its name is dynamic.
}
class Base2 {
[sym]() {}
}
class Derived2 extends Base2 {
[sym]() {}
}
class Base3 {}
class Derived3 extends Base3 {
override [sym]() {}
~~~~~
!!! error TS4127: This member cannot have an 'override' modifier because its name is dynamic.
}

View File

@@ -0,0 +1,49 @@
//// [tests/cases/conformance/override/overrideLateBindableIndexSignature1.ts] ////
//// [overrideLateBindableIndexSignature1.ts]
const sym: symbol = Symbol();
class Base1 {
[sym]() {}
}
class Derived1 extends Base1 {
override [sym]() {}
}
class Base2 {
[sym]() {}
}
class Derived2 extends Base2 {
[sym]() {}
}
class Base3 {}
class Derived3 extends Base3 {
override [sym]() {}
}
//// [overrideLateBindableIndexSignature1.d.ts]
declare const sym: symbol;
declare class Base1 {
[x: symbol]: () => void;
}
declare class Derived1 extends Base1 {
[x: symbol]: () => void;
}
declare class Base2 {
[x: symbol]: () => void;
}
declare class Derived2 extends Base2 {
[x: symbol]: () => void;
}
declare class Base3 {
}
declare class Derived3 extends Base3 {
[x: symbol]: () => void;
}

View File

@@ -0,0 +1,53 @@
//// [tests/cases/conformance/override/overrideLateBindableIndexSignature1.ts] ////
=== overrideLateBindableIndexSignature1.ts ===
const sym: symbol = Symbol();
>sym : Symbol(sym, Decl(overrideLateBindableIndexSignature1.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 Base1 {
>Base1 : Symbol(Base1, Decl(overrideLateBindableIndexSignature1.ts, 0, 29))
[sym]() {}
>[sym] : Symbol(Base1[sym], Decl(overrideLateBindableIndexSignature1.ts, 2, 13))
>sym : Symbol(sym, Decl(overrideLateBindableIndexSignature1.ts, 0, 5))
}
class Derived1 extends Base1 {
>Derived1 : Symbol(Derived1, Decl(overrideLateBindableIndexSignature1.ts, 4, 1))
>Base1 : Symbol(Base1, Decl(overrideLateBindableIndexSignature1.ts, 0, 29))
override [sym]() {}
>[sym] : Symbol(Derived1[sym], Decl(overrideLateBindableIndexSignature1.ts, 6, 30))
>sym : Symbol(sym, Decl(overrideLateBindableIndexSignature1.ts, 0, 5))
}
class Base2 {
>Base2 : Symbol(Base2, Decl(overrideLateBindableIndexSignature1.ts, 8, 1))
[sym]() {}
>[sym] : Symbol(Base2[sym], Decl(overrideLateBindableIndexSignature1.ts, 10, 13))
>sym : Symbol(sym, Decl(overrideLateBindableIndexSignature1.ts, 0, 5))
}
class Derived2 extends Base2 {
>Derived2 : Symbol(Derived2, Decl(overrideLateBindableIndexSignature1.ts, 12, 1))
>Base2 : Symbol(Base2, Decl(overrideLateBindableIndexSignature1.ts, 8, 1))
[sym]() {}
>[sym] : Symbol(Derived2[sym], Decl(overrideLateBindableIndexSignature1.ts, 14, 30))
>sym : Symbol(sym, Decl(overrideLateBindableIndexSignature1.ts, 0, 5))
}
class Base3 {}
>Base3 : Symbol(Base3, Decl(overrideLateBindableIndexSignature1.ts, 16, 1))
class Derived3 extends Base3 {
>Derived3 : Symbol(Derived3, Decl(overrideLateBindableIndexSignature1.ts, 18, 14))
>Base3 : Symbol(Base3, Decl(overrideLateBindableIndexSignature1.ts, 16, 1))
override [sym]() {}
>[sym] : Symbol(Derived3[sym], Decl(overrideLateBindableIndexSignature1.ts, 20, 30))
>sym : Symbol(sym, Decl(overrideLateBindableIndexSignature1.ts, 0, 5))
}

View File

@@ -0,0 +1,76 @@
//// [tests/cases/conformance/override/overrideLateBindableIndexSignature1.ts] ////
=== overrideLateBindableIndexSignature1.ts ===
const sym: symbol = Symbol();
>sym : symbol
> : ^^^^^^
>Symbol() : unique symbol
> : ^^^^^^^^^^^^^
>Symbol : SymbolConstructor
> : ^^^^^^^^^^^^^^^^^
class Base1 {
>Base1 : Base1
> : ^^^^^
[sym]() {}
>[sym] : () => void
> : ^^^^^^^^^^
>sym : symbol
> : ^^^^^^
}
class Derived1 extends Base1 {
>Derived1 : Derived1
> : ^^^^^^^^
>Base1 : Base1
> : ^^^^^
override [sym]() {}
>[sym] : () => void
> : ^^^^^^^^^^
>sym : symbol
> : ^^^^^^
}
class Base2 {
>Base2 : Base2
> : ^^^^^
[sym]() {}
>[sym] : () => void
> : ^^^^^^^^^^
>sym : symbol
> : ^^^^^^
}
class Derived2 extends Base2 {
>Derived2 : Derived2
> : ^^^^^^^^
>Base2 : Base2
> : ^^^^^
[sym]() {}
>[sym] : () => void
> : ^^^^^^^^^^
>sym : symbol
> : ^^^^^^
}
class Base3 {}
>Base3 : Base3
> : ^^^^^
class Derived3 extends Base3 {
>Derived3 : Derived3
> : ^^^^^^^^
>Base3 : Base3
> : ^^^^^
override [sym]() {}
>[sym] : () => void
> : ^^^^^^^^^^
>sym : symbol
> : ^^^^^^
}

View File

@@ -0,0 +1,33 @@
overrideLateBindableIndexSignature1.ts(8,12): error TS4127: This member cannot have an 'override' modifier because its name is dynamic.
overrideLateBindableIndexSignature1.ts(22,12): error TS4127: This member cannot have an 'override' modifier because its name is dynamic.
==== overrideLateBindableIndexSignature1.ts (2 errors) ====
const sym: symbol = Symbol();
class Base1 {
[sym]() {}
}
class Derived1 extends Base1 {
override [sym]() {}
~~~~~
!!! error TS4127: This member cannot have an 'override' modifier because its name is dynamic.
}
class Base2 {
[sym]() {}
}
class Derived2 extends Base2 {
[sym]() {}
}
class Base3 {}
class Derived3 extends Base3 {
override [sym]() {}
~~~~~
!!! error TS4127: This member cannot have an 'override' modifier because its name is dynamic.
}

View File

@@ -0,0 +1,49 @@
//// [tests/cases/conformance/override/overrideLateBindableIndexSignature1.ts] ////
//// [overrideLateBindableIndexSignature1.ts]
const sym: symbol = Symbol();
class Base1 {
[sym]() {}
}
class Derived1 extends Base1 {
override [sym]() {}
}
class Base2 {
[sym]() {}
}
class Derived2 extends Base2 {
[sym]() {}
}
class Base3 {}
class Derived3 extends Base3 {
override [sym]() {}
}
//// [overrideLateBindableIndexSignature1.d.ts]
declare const sym: symbol;
declare class Base1 {
[x: symbol]: () => void;
}
declare class Derived1 extends Base1 {
[x: symbol]: () => void;
}
declare class Base2 {
[x: symbol]: () => void;
}
declare class Derived2 extends Base2 {
[x: symbol]: () => void;
}
declare class Base3 {
}
declare class Derived3 extends Base3 {
[x: symbol]: () => void;
}

View File

@@ -0,0 +1,53 @@
//// [tests/cases/conformance/override/overrideLateBindableIndexSignature1.ts] ////
=== overrideLateBindableIndexSignature1.ts ===
const sym: symbol = Symbol();
>sym : Symbol(sym, Decl(overrideLateBindableIndexSignature1.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 Base1 {
>Base1 : Symbol(Base1, Decl(overrideLateBindableIndexSignature1.ts, 0, 29))
[sym]() {}
>[sym] : Symbol(Base1[sym], Decl(overrideLateBindableIndexSignature1.ts, 2, 13))
>sym : Symbol(sym, Decl(overrideLateBindableIndexSignature1.ts, 0, 5))
}
class Derived1 extends Base1 {
>Derived1 : Symbol(Derived1, Decl(overrideLateBindableIndexSignature1.ts, 4, 1))
>Base1 : Symbol(Base1, Decl(overrideLateBindableIndexSignature1.ts, 0, 29))
override [sym]() {}
>[sym] : Symbol(Derived1[sym], Decl(overrideLateBindableIndexSignature1.ts, 6, 30))
>sym : Symbol(sym, Decl(overrideLateBindableIndexSignature1.ts, 0, 5))
}
class Base2 {
>Base2 : Symbol(Base2, Decl(overrideLateBindableIndexSignature1.ts, 8, 1))
[sym]() {}
>[sym] : Symbol(Base2[sym], Decl(overrideLateBindableIndexSignature1.ts, 10, 13))
>sym : Symbol(sym, Decl(overrideLateBindableIndexSignature1.ts, 0, 5))
}
class Derived2 extends Base2 {
>Derived2 : Symbol(Derived2, Decl(overrideLateBindableIndexSignature1.ts, 12, 1))
>Base2 : Symbol(Base2, Decl(overrideLateBindableIndexSignature1.ts, 8, 1))
[sym]() {}
>[sym] : Symbol(Derived2[sym], Decl(overrideLateBindableIndexSignature1.ts, 14, 30))
>sym : Symbol(sym, Decl(overrideLateBindableIndexSignature1.ts, 0, 5))
}
class Base3 {}
>Base3 : Symbol(Base3, Decl(overrideLateBindableIndexSignature1.ts, 16, 1))
class Derived3 extends Base3 {
>Derived3 : Symbol(Derived3, Decl(overrideLateBindableIndexSignature1.ts, 18, 14))
>Base3 : Symbol(Base3, Decl(overrideLateBindableIndexSignature1.ts, 16, 1))
override [sym]() {}
>[sym] : Symbol(Derived3[sym], Decl(overrideLateBindableIndexSignature1.ts, 20, 30))
>sym : Symbol(sym, Decl(overrideLateBindableIndexSignature1.ts, 0, 5))
}

View File

@@ -0,0 +1,76 @@
//// [tests/cases/conformance/override/overrideLateBindableIndexSignature1.ts] ////
=== overrideLateBindableIndexSignature1.ts ===
const sym: symbol = Symbol();
>sym : symbol
> : ^^^^^^
>Symbol() : unique symbol
> : ^^^^^^^^^^^^^
>Symbol : SymbolConstructor
> : ^^^^^^^^^^^^^^^^^
class Base1 {
>Base1 : Base1
> : ^^^^^
[sym]() {}
>[sym] : () => void
> : ^^^^^^^^^^
>sym : symbol
> : ^^^^^^
}
class Derived1 extends Base1 {
>Derived1 : Derived1
> : ^^^^^^^^
>Base1 : Base1
> : ^^^^^
override [sym]() {}
>[sym] : () => void
> : ^^^^^^^^^^
>sym : symbol
> : ^^^^^^
}
class Base2 {
>Base2 : Base2
> : ^^^^^
[sym]() {}
>[sym] : () => void
> : ^^^^^^^^^^
>sym : symbol
> : ^^^^^^
}
class Derived2 extends Base2 {
>Derived2 : Derived2
> : ^^^^^^^^
>Base2 : Base2
> : ^^^^^
[sym]() {}
>[sym] : () => void
> : ^^^^^^^^^^
>sym : symbol
> : ^^^^^^
}
class Base3 {}
>Base3 : Base3
> : ^^^^^
class Derived3 extends Base3 {
>Derived3 : Derived3
> : ^^^^^^^^
>Base3 : Base3
> : ^^^^^
override [sym]() {}
>[sym] : () => void
> : ^^^^^^^^^^
>sym : symbol
> : ^^^^^^
}

View File

@@ -0,0 +1,30 @@
overrideLateBindableName1.ts(22,12): error TS4113: This member cannot have an 'override' modifier because it is not declared in the base class 'Base3'.
==== overrideLateBindableName1.ts (1 errors) ====
const prop = "foo"
class Base1 {
[prop]() {}
}
class Derived1 extends Base1 {
override [prop]() {}
}
class Base2 {
[prop]() {}
}
class Derived2 extends Base2 {
[prop]() {}
}
class Base3 {}
class Derived3 extends Base3 {
override [prop]() {}
~~~~~~
!!! error TS4113: This member cannot have an 'override' modifier because it is not declared in the base class 'Base3'.
}

View File

@@ -0,0 +1,49 @@
//// [tests/cases/conformance/override/overrideLateBindableName1.ts] ////
//// [overrideLateBindableName1.ts]
const prop = "foo"
class Base1 {
[prop]() {}
}
class Derived1 extends Base1 {
override [prop]() {}
}
class Base2 {
[prop]() {}
}
class Derived2 extends Base2 {
[prop]() {}
}
class Base3 {}
class Derived3 extends Base3 {
override [prop]() {}
}
//// [overrideLateBindableName1.d.ts]
declare const prop = "foo";
declare class Base1 {
[prop](): void;
}
declare class Derived1 extends Base1 {
[prop](): void;
}
declare class Base2 {
[prop](): void;
}
declare class Derived2 extends Base2 {
[prop](): void;
}
declare class Base3 {
}
declare class Derived3 extends Base3 {
[prop](): void;
}

View File

@@ -0,0 +1,52 @@
//// [tests/cases/conformance/override/overrideLateBindableName1.ts] ////
=== overrideLateBindableName1.ts ===
const prop = "foo"
>prop : Symbol(prop, Decl(overrideLateBindableName1.ts, 0, 5))
class Base1 {
>Base1 : Symbol(Base1, Decl(overrideLateBindableName1.ts, 0, 18))
[prop]() {}
>[prop] : Symbol(Base1[prop], Decl(overrideLateBindableName1.ts, 2, 13))
>prop : Symbol(prop, Decl(overrideLateBindableName1.ts, 0, 5))
}
class Derived1 extends Base1 {
>Derived1 : Symbol(Derived1, Decl(overrideLateBindableName1.ts, 4, 1))
>Base1 : Symbol(Base1, Decl(overrideLateBindableName1.ts, 0, 18))
override [prop]() {}
>[prop] : Symbol(Derived1[prop], Decl(overrideLateBindableName1.ts, 6, 30))
>prop : Symbol(prop, Decl(overrideLateBindableName1.ts, 0, 5))
}
class Base2 {
>Base2 : Symbol(Base2, Decl(overrideLateBindableName1.ts, 8, 1))
[prop]() {}
>[prop] : Symbol(Base2[prop], Decl(overrideLateBindableName1.ts, 10, 13))
>prop : Symbol(prop, Decl(overrideLateBindableName1.ts, 0, 5))
}
class Derived2 extends Base2 {
>Derived2 : Symbol(Derived2, Decl(overrideLateBindableName1.ts, 12, 1))
>Base2 : Symbol(Base2, Decl(overrideLateBindableName1.ts, 8, 1))
[prop]() {}
>[prop] : Symbol(Derived2[prop], Decl(overrideLateBindableName1.ts, 14, 30))
>prop : Symbol(prop, Decl(overrideLateBindableName1.ts, 0, 5))
}
class Base3 {}
>Base3 : Symbol(Base3, Decl(overrideLateBindableName1.ts, 16, 1))
class Derived3 extends Base3 {
>Derived3 : Symbol(Derived3, Decl(overrideLateBindableName1.ts, 18, 14))
>Base3 : Symbol(Base3, Decl(overrideLateBindableName1.ts, 16, 1))
override [prop]() {}
>[prop] : Symbol(Derived3[prop], Decl(overrideLateBindableName1.ts, 20, 30))
>prop : Symbol(prop, Decl(overrideLateBindableName1.ts, 0, 5))
}

View File

@@ -0,0 +1,74 @@
//// [tests/cases/conformance/override/overrideLateBindableName1.ts] ////
=== overrideLateBindableName1.ts ===
const prop = "foo"
>prop : "foo"
> : ^^^^^
>"foo" : "foo"
> : ^^^^^
class Base1 {
>Base1 : Base1
> : ^^^^^
[prop]() {}
>[prop] : () => void
> : ^^^^^^^^^^
>prop : "foo"
> : ^^^^^
}
class Derived1 extends Base1 {
>Derived1 : Derived1
> : ^^^^^^^^
>Base1 : Base1
> : ^^^^^
override [prop]() {}
>[prop] : () => void
> : ^^^^^^^^^^
>prop : "foo"
> : ^^^^^
}
class Base2 {
>Base2 : Base2
> : ^^^^^
[prop]() {}
>[prop] : () => void
> : ^^^^^^^^^^
>prop : "foo"
> : ^^^^^
}
class Derived2 extends Base2 {
>Derived2 : Derived2
> : ^^^^^^^^
>Base2 : Base2
> : ^^^^^
[prop]() {}
>[prop] : () => void
> : ^^^^^^^^^^
>prop : "foo"
> : ^^^^^
}
class Base3 {}
>Base3 : Base3
> : ^^^^^
class Derived3 extends Base3 {
>Derived3 : Derived3
> : ^^^^^^^^
>Base3 : Base3
> : ^^^^^
override [prop]() {}
>[prop] : () => void
> : ^^^^^^^^^^
>prop : "foo"
> : ^^^^^
}

View File

@@ -0,0 +1,33 @@
overrideLateBindableName1.ts(16,3): error TS4114: This member must have an 'override' modifier because it overrides a member in the base class 'Base2'.
overrideLateBindableName1.ts(22,12): error TS4113: This member cannot have an 'override' modifier because it is not declared in the base class 'Base3'.
==== overrideLateBindableName1.ts (2 errors) ====
const prop = "foo"
class Base1 {
[prop]() {}
}
class Derived1 extends Base1 {
override [prop]() {}
}
class Base2 {
[prop]() {}
}
class Derived2 extends Base2 {
[prop]() {}
~~~~~~
!!! error TS4114: This member must have an 'override' modifier because it overrides a member in the base class 'Base2'.
}
class Base3 {}
class Derived3 extends Base3 {
override [prop]() {}
~~~~~~
!!! error TS4113: This member cannot have an 'override' modifier because it is not declared in the base class 'Base3'.
}

View File

@@ -0,0 +1,49 @@
//// [tests/cases/conformance/override/overrideLateBindableName1.ts] ////
//// [overrideLateBindableName1.ts]
const prop = "foo"
class Base1 {
[prop]() {}
}
class Derived1 extends Base1 {
override [prop]() {}
}
class Base2 {
[prop]() {}
}
class Derived2 extends Base2 {
[prop]() {}
}
class Base3 {}
class Derived3 extends Base3 {
override [prop]() {}
}
//// [overrideLateBindableName1.d.ts]
declare const prop = "foo";
declare class Base1 {
[prop](): void;
}
declare class Derived1 extends Base1 {
[prop](): void;
}
declare class Base2 {
[prop](): void;
}
declare class Derived2 extends Base2 {
[prop](): void;
}
declare class Base3 {
}
declare class Derived3 extends Base3 {
[prop](): void;
}

View File

@@ -0,0 +1,52 @@
//// [tests/cases/conformance/override/overrideLateBindableName1.ts] ////
=== overrideLateBindableName1.ts ===
const prop = "foo"
>prop : Symbol(prop, Decl(overrideLateBindableName1.ts, 0, 5))
class Base1 {
>Base1 : Symbol(Base1, Decl(overrideLateBindableName1.ts, 0, 18))
[prop]() {}
>[prop] : Symbol(Base1[prop], Decl(overrideLateBindableName1.ts, 2, 13))
>prop : Symbol(prop, Decl(overrideLateBindableName1.ts, 0, 5))
}
class Derived1 extends Base1 {
>Derived1 : Symbol(Derived1, Decl(overrideLateBindableName1.ts, 4, 1))
>Base1 : Symbol(Base1, Decl(overrideLateBindableName1.ts, 0, 18))
override [prop]() {}
>[prop] : Symbol(Derived1[prop], Decl(overrideLateBindableName1.ts, 6, 30))
>prop : Symbol(prop, Decl(overrideLateBindableName1.ts, 0, 5))
}
class Base2 {
>Base2 : Symbol(Base2, Decl(overrideLateBindableName1.ts, 8, 1))
[prop]() {}
>[prop] : Symbol(Base2[prop], Decl(overrideLateBindableName1.ts, 10, 13))
>prop : Symbol(prop, Decl(overrideLateBindableName1.ts, 0, 5))
}
class Derived2 extends Base2 {
>Derived2 : Symbol(Derived2, Decl(overrideLateBindableName1.ts, 12, 1))
>Base2 : Symbol(Base2, Decl(overrideLateBindableName1.ts, 8, 1))
[prop]() {}
>[prop] : Symbol(Derived2[prop], Decl(overrideLateBindableName1.ts, 14, 30))
>prop : Symbol(prop, Decl(overrideLateBindableName1.ts, 0, 5))
}
class Base3 {}
>Base3 : Symbol(Base3, Decl(overrideLateBindableName1.ts, 16, 1))
class Derived3 extends Base3 {
>Derived3 : Symbol(Derived3, Decl(overrideLateBindableName1.ts, 18, 14))
>Base3 : Symbol(Base3, Decl(overrideLateBindableName1.ts, 16, 1))
override [prop]() {}
>[prop] : Symbol(Derived3[prop], Decl(overrideLateBindableName1.ts, 20, 30))
>prop : Symbol(prop, Decl(overrideLateBindableName1.ts, 0, 5))
}

View File

@@ -0,0 +1,74 @@
//// [tests/cases/conformance/override/overrideLateBindableName1.ts] ////
=== overrideLateBindableName1.ts ===
const prop = "foo"
>prop : "foo"
> : ^^^^^
>"foo" : "foo"
> : ^^^^^
class Base1 {
>Base1 : Base1
> : ^^^^^
[prop]() {}
>[prop] : () => void
> : ^^^^^^^^^^
>prop : "foo"
> : ^^^^^
}
class Derived1 extends Base1 {
>Derived1 : Derived1
> : ^^^^^^^^
>Base1 : Base1
> : ^^^^^
override [prop]() {}
>[prop] : () => void
> : ^^^^^^^^^^
>prop : "foo"
> : ^^^^^
}
class Base2 {
>Base2 : Base2
> : ^^^^^
[prop]() {}
>[prop] : () => void
> : ^^^^^^^^^^
>prop : "foo"
> : ^^^^^
}
class Derived2 extends Base2 {
>Derived2 : Derived2
> : ^^^^^^^^
>Base2 : Base2
> : ^^^^^
[prop]() {}
>[prop] : () => void
> : ^^^^^^^^^^
>prop : "foo"
> : ^^^^^
}
class Base3 {}
>Base3 : Base3
> : ^^^^^
class Derived3 extends Base3 {
>Derived3 : Derived3
> : ^^^^^^^^
>Base3 : Base3
> : ^^^^^
override [prop]() {}
>[prop] : () => void
> : ^^^^^^^^^^
>prop : "foo"
> : ^^^^^
}

View File

@@ -0,0 +1,30 @@
// @strict: true
// @lib: esnext
// @target: esnext
// @noImplicitOverride: true, false
// @declaration: true
// @emitDeclarationOnly: true
let prop = "foo"
class Base1 {
[prop]() {}
}
class Derived1 extends Base1 {
override [prop]() {}
}
class Base2 {
[prop]() {}
}
class Derived2 extends Base2 {
[prop]() {}
}
class Base3 {}
class Derived3 extends Base3 {
override [prop]() {}
}

View File

@@ -0,0 +1,30 @@
// @strict: true
// @lib: esnext
// @target: esnext
// @noImplicitOverride: true, false
// @declaration: true
// @emitDeclarationOnly: true
const sym: symbol = Symbol();
class Base1 {
[sym]() {}
}
class Derived1 extends Base1 {
override [sym]() {}
}
class Base2 {
[sym]() {}
}
class Derived2 extends Base2 {
[sym]() {}
}
class Base3 {}
class Derived3 extends Base3 {
override [sym]() {}
}

View File

@@ -0,0 +1,30 @@
// @strict: true
// @lib: esnext
// @target: esnext
// @noImplicitOverride: true, false
// @declaration: true
// @emitDeclarationOnly: true
const prop = "foo"
class Base1 {
[prop]() {}
}
class Derived1 extends Base1 {
override [prop]() {}
}
class Base2 {
[prop]() {}
}
class Derived2 extends Base2 {
[prop]() {}
}
class Base3 {}
class Derived3 extends Base3 {
override [prop]() {}
}