ES `ClassDecoratorContext.name` has incorrect value with static `name`
#62,870 opened on 2025幎12æ9æ¥
Repository metrics
- Stars
- Â (48,455 stars)
- PR merge metrics
-  (å¹³åããŒãž 3d 5h) (30d ã§ 8 merged PRs)
説æ
ð Search Terms
ClassDecoratorContext static name
ð Version & Regression Information
5.0.4-5.9.3
⯠Playground Link
ð» 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("")