500a0df6f3
* Disallow property/accessor overrides Unless the base property or accessor is abstract * Disallow uninitialised property overrides This causes quite a few test breaks. We'll probably want to revert many of them by switching to the upcoming `declare x: number` syntax. * Updates from design review + fix ancient bug 1. Don't error when overriding properties from interfaces. 2. Fix error when overriding methods with other things. This had no tests so I assume that the code was always dead and never worked. * Need to add a couple of errors and squash one Will update after checking out other branch for a minute * Everything works so far Need to test properties initialised in constructor * Check for constructor initialisation * change error wording * Improve error wording * Add codefix to add missing 'declare' * Always emit accessors in .d.ts files * Allow 'declare' on any uninitialised property decl * Undo code moves * Let sleeping dogs lie * Correctly set NodeFlags.Ambient And simplify redundant parts of check. * Remove more unneeded code * Update baselines * Update baselines * Update baselines * Ignore this-property assignments * Fix base-in-interface check * Do not error when base parent is interface * Fix base interface check * Add missed baselines * Fix check * Fix new errors in services * Fix new errors in services * Fix errors in testRunner * Add flag and turn off errors when on * Structure of new emit is correct, fake content It is 'hi'. * Basically right emit * Fix one last unitialised property declaration * Haha no I missed another one * Fix whitespace back to CRLF * Minor fix and code cleanup * New test case * Fix bug in isInitializedProperty * Updates from design meeting. 1. Change flag name to useDefineForClassFields (and flip polarity). 2. Forbid ES3 + useDefineForClassFields (since there is no defineProperty). 3. Forbid overriding an abstract property-with-initializer with an accessor. * Update baselines * Object.defineProperty for methods too Using code from Ron from his upcoming refactor of the factory functions. * Update slow baselines * Improve error message * Update src/compiler/transformers/utilities.ts Co-Authored-By: Andrew Branch <andrewbranch@users.noreply.github.com> * Add test of computed properties * Remove done TODO
67 lines
1.2 KiB
TypeScript
67 lines
1.2 KiB
TypeScript
// @strict: true
|
|
class A {
|
|
property = 'x';
|
|
m() { return 1 }
|
|
}
|
|
class B extends A {
|
|
property: any; // error
|
|
}
|
|
class BD extends A {
|
|
declare property: any; // ok because it's implicitly initialised
|
|
}
|
|
class BDBang extends A {
|
|
declare property!: any; // ! is not allowed, this is an ambient declaration
|
|
}
|
|
class BOther extends A {
|
|
declare m() { return 2 } // not allowed on methods
|
|
declare nonce: any; // ok, even though it's not in the base
|
|
declare property = 'y' // initialiser not allowed with declare
|
|
}
|
|
class U {
|
|
declare nonce: any; // ok, even though there's no base
|
|
}
|
|
|
|
class C {
|
|
p: string;
|
|
}
|
|
class D extends C {
|
|
p: 'hi'; // error
|
|
}
|
|
class DD extends C {
|
|
declare p: 'bye'; // ok
|
|
}
|
|
|
|
|
|
declare class E {
|
|
p1: string
|
|
p2: string
|
|
}
|
|
class F extends E {
|
|
p1!: 'z'
|
|
declare p2: 'alpha'
|
|
}
|
|
|
|
class G extends E {
|
|
p1: 'z'
|
|
constructor() {
|
|
super()
|
|
this.p1 = 'z'
|
|
}
|
|
}
|
|
|
|
abstract class H extends E {
|
|
abstract p1: 'a' | 'b' | 'c'
|
|
declare abstract p2: 'a' | 'b' | 'c'
|
|
}
|
|
|
|
interface I {
|
|
q: number
|
|
}
|
|
interface J extends I { }
|
|
class J {
|
|
r = 5
|
|
}
|
|
class K extends J {
|
|
q!: 1 | 2 | 3 // ok, extends a property from an interface
|
|
r!: 4 | 5 // error, from class
|
|
}
|