Skip to content

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

@miyaokamarina

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("")

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