Skip to content

useDefineForClassFields defaults to true in 4.2.4Β #45584

Closed
@KeithHenry

Description

@KeithHenry

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    QuestionAn issue which isn't directly actionable in code

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions