Microsoft/TypeScript

static block on unnamed class produces invalid javascript

Open

#60,879 opened on Dec 30, 2024

View on GitHub
 (0 comments) (1 reaction) (0 assignees)TypeScript (48,455 stars) (6,726 forks)batch import
BugDomain: JS EmitHelp Wanted

Description

🔎 Search Terms

  • class
  • invalid
  • codegen
  • static

🕗 Version & Regression Information

  • This changed after version 4.4
  • This is the behavior in every version I tried, and I reviewed the FAQ for entries about classes, static members of classes
  • I was unable to test this on prior versions because static blocks where introduced in typescript 4.4

⏯ Playground Link

https://www.typescriptlang.org/play/?ts=5.8.0-dev.20241229#code/KYDwDg9gTgLgBAE2AMwIYFcA28DGnUDOBA3gFBwVwEyowCWOiwAthAFwB26zARsFAG5ylarQZwylKXBgALOgQB0SVnAC8cAIxCpAX1K6gA

💻 Code

export default class{
    static demo:number;
    static {
        this.demo = 1;
    }
}

🙁 Actual behavior

TypeScript produces an invalid output where the code references an undefined default_1 I'm assuming the empty class is meant to be assigned to this.

example output:

var _a;
class {
}
_a = default_1;
(() => {
    _a.demo = 1;
})();
export default default_1;

🙂 Expected behavior

I would expect typescript to assign the class to the generated default_1

Additional information about the issue

TypeScript has been exhibiting this behavior since support for static blocks was introduced as far as I can tell, prior to version 4.4.4 in the playground produces a different set of invalid code where it just moves the block outside of the class with no modification.

this still technically happens without the export default but typescript does have a warning.

Contributor guide