Microsoft/TypeScript
View on GitHubES `ClassDecoratorContext.name` has incorrect value with static `name`
Open
#62870 opened on Dec 9, 2025
BugDomain: DecoratorsHelp Wanted
Description
🔎 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("")