Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

When useDefineForClassFields is false and the class has a decorator, private fields are incorrectly initialized before the super call #3939

Open
volkanceylan opened this issue Oct 9, 2024 · 3 comments

Comments

@volkanceylan
Copy link

I think this is an issue introduced in 0.24 as 0.23.1 does not have this problem. Probably related to #3913

{
  loader: 'ts',
  format: 'iife',
  target: 'es2015',
  tsconfigRaw: {
    compilerOptions: {
      useDefineForClassFields: false
    }
  }
}
function testDecorator(a: string) {
  return function (target: Function, _context?: any) { }
}

class A {
   constructor() {
   }
}

@testDecorator("a")
class B extends A {
  private m1: any;

  constructor() {
    super();
  }

}

new B();

The generated constructor for the derived B class with a private field includes a field initializer before the super call which results in the following error in browser console if you copy paste the generated code:

VM17:64 Uncaught ReferenceError: Must call super constructor in derived class 
before accessing 'this' or returning from derived constructor
    at new B (<anonymous>:64:7)
    at <anonymous>:71:3
    at <anonymous>:72:3
class B extends (_a = A) {
    constructor() {
      this.m1 = void 0;
      super();
    }
  }
@volkanceylan
Copy link
Author

Note that this only occurs if the property has no assigned value. If private m1: any = null is used, the initializer is correctly generated after the super() call.

@volkanceylan
Copy link
Author

Another thing to consider after looking at #3913 is, if this behavior should apply only for properties with decorators or even when only the class has a decorator as in my case. Otherwise this will be a breaking change for those using useDefineForClassFields: false. Does TypeScript behave this way, e.g. also for class decorators?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant