Description
Bug Report
π Search Terms
useDefineForClassFields
π Version & Regression Information
- This changed sometime between versions 3.7 and 4.2.4
- Upgrading the version of Typescript in Visual Studio 2019 introduced this issue
β― Playground Link
Same code compiles in VS Code and command lines, it breaks in Visual Studio 2019+Typescript 4.2.4 only
π» Code
Use a @decorator
on class properties or any code that is incompatible with useDefineForClassFields: true
Something like:
class MyClass {
@myDecorator()
myField: any;
}
Do not include useDefineForClassFields
in your tsconfig.json
at all.
Run Typescript compile.
When VS2019 with TS 4.2.4 compiles JS output includes class fields, something like:
var __decorate = // ...autogenerated implementation
let MyClass = class MyClass {
myField;
};
__decorate([
myDecorator()
], MyClass.prototype, "myField", null);
When tsc
4.3.5 compiles for the same tsconfig
and source files it doesn't include class fields, something like:
var __decorate = // ...autogenerated implementation
let MyClass = class MyClass {
// No fields here
};
__decorate([
myDecorator()
], MyClass.prototype, "myField", null);
Adding useDefineForClassFields: false
works around the issue and makes the JS output consistent.
Property decorators are ignored (as per #35081).
π Actual behaviour
JS output includes class fields (as if useDefineForClassFields
was set to true) in VS2019+TS 4.2.4
JS output does not include class fields (as if useDefineForClassFields
was set to false) in tsc 3.7 or 4.3
π Expected behaviour
JS output should not include class fields unless useDefineForClassFields
is explicitly set to true.
Whatever default useDefineForClassFields
setting is should be consistent between tsc and VS2019+TS