Skip to content

ES ClassDecoratorContext.name has incorrect value with static name #62870

Description

@miyaokamarina

🔎 Search Terms

ClassDecoratorContext static name

🕗 Version & Regression Information

5.0.4-5.9.3

⏯ Playground Link

https://tsplay.dev/N7vAow

💻 Code

const decorate = (_: unknown, ctx: ClassDecoratorContext) => {
    console.log('decorate(%o)', ctx.name);
};

@decorate
class A {
    static get name() {
        return 2434;
    }
}

🙁 Actual behavior

ctx.name is 2434 (from A.name)

🙂 Expected behavior

ctx.name is 'A' (actual class name)

Additional information about the issue

The wrong value comes from the context initializer in the emitted code:

__esDecorate(
    null,
    (_classDescriptor = { value: _classThis }),
    _classDecorators,
    { kind: 'class', name: _classThis.name, metadata: _metadata },
    null,
    _classExtraInitializers,
);

The context name is initialized with _classThis.name (which triggers the getter) instead of the actual class name value (literal "A" in this case).

Possible Fix

Currently, the _classThis.name fragment comes from const classNameReference in transformClassLike in transformers/esDecorators.ts:

const classNameReference = factory.createPropertyAccessExpression(renamedClassThis, "name");

It should be adjusted to get an actual class name (either literal or computed), possibly like this:

const classNameReference = node.name ? factory.createStringLiteralFromNode(node.name) :
    node.emitNode?.assignedName ?? factory.createStringLiteral("")

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    BugA bug in TypeScriptDomain: DecoratorsThe issue relates to the decorator syntaxHelp WantedYou can do this

    Type

    No type

    Projects

    No projects

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions