-
Notifications
You must be signed in to change notification settings - Fork 12.9k
Closed
Labels
Breaking ChangeWould introduce errors in existing codeWould introduce errors in existing codeBugA bug in TypeScriptA bug in TypeScriptES NextNew featurers for ECMAScript (a.k.a. ESNext)New featurers for ECMAScript (a.k.a. ESNext)
Milestone
Description
From #12212 (comment) @joeywatts:
class A {
property = 'some string';
}
class B extends A {
property;
}
const instanceB = new B();
// "some string" or "undefined" ?
console.log(instanceB.property);
It appears from the current definition at https://github.com/tc39/proposal-class-fields that this code will print undefined
.
If the proposal advances further with these semantics, we'll need to figure out a mitigation strategy, preferably sooner rather than later.
One option is to make the code as written a type error for ~2 versions and force people to write an explicit = undefined
initializer, then remove the error.
Edit [@sandersn]:
Here is the current plan, together with what has happened so far.
TypeScript 3.6
- Allow accessors in ambient class declarations #32787: allow accessors like
declare class C { get p(): number; }
(andset
as well) - No changes to .js emit yet
- No changes to .d.ts emit yet
TypeScript 3.7
- Always emit accessors in .d.ts files #33470: emit get/set accessors in declaration files
- Disallow property/accessor overrides #33401: accessors may not override properties and vice versa.
- Disallow uninitialised property overrides #33423: uninitialised properties may not override properties.
- Introduce new syntax,
class C extends B { declare x: number }
- Introduce a codefix that inserts
declare
where needed. - This declaration is erased, like the original declaration in old versions of TS
- Introduce new syntax,
- Add useDefineForClassFields flag for Set -> Define property declaration #33509 Introduce a new flag,
useDefineForClassFields
.- When
"useDefineForClassFields": false
:- Initialized fields in class bodies are emitted as constructor assignments (even when targeting ESNext).
- Uninitialized fields in class bodies are erased.
- The preceding errors are silenced.
- When
"useDefineForClassFields": true
:- Fields in class bodies are emitted as-is for ESNext.
- Fields in class bodies are emitted as Object.defineProperty assignments in the constructor otherwise.
- In 3.7,
"useDefineForClassFields"
defaults tofalse
- Declaration emit is the same regardless of the flag's value.
- When
TypeScript 3.8
(or, the first version after class fields reaches Stage 4)
-
"useDefineForClassFields"
defaults to true when targetting ESNext. - issue new errors as suggestions with codefixes, even when
"useDefineForClassFields": false
.
littledan, saschanaz, nicolashenry, SanderElias, brianmhunt and 7 more
Metadata
Metadata
Labels
Breaking ChangeWould introduce errors in existing codeWould introduce errors in existing codeBugA bug in TypeScriptA bug in TypeScriptES NextNew featurers for ECMAScript (a.k.a. ESNext)New featurers for ECMAScript (a.k.a. ESNext)