microsoft / microsoft/TypeScript

ES `ClassDecoratorContext.name` has incorrect value with static `name`

Ouverte
#62,870 2 commentaires 0 réactions 0 personnes assignées Voir sur GitHub

Personne n'a encore pris cette issue.

Bug Domain: Decorators Help Wanted
Langage dominant
Go
Étoiles
111k
Forks
14.3k
Merge moyen
2 j 4 h
PR mergées (30 j)
132

Description

### 🔎 Search Terms

ClassDecoratorContext static name

### 🕗 Version & Regression Information

5.0.4-5.9.3

### ⏯ Playground Link

https://tsplay.dev/N7vAow

### 💻 Code

```ts
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:

```ts
__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`:

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

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

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

Guide de contribution

Ouvrir le guide de contribution

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Piste de recherche

Commencez dans transformers/esDecorators.ts, au niveau de transformClassLike, et examinez comment classNameReference est construit pour le contexte du décorateur de classe. Reproduisez le problème avec le playground lié, puis vérifiez qu’une classe avec un getter statique de name fournit à ctx.name son nom effectivement déclaré, tel que "A", plutôt que le résultat du getter.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Évaluation

Stack technique
typescript
Domaine
compilers
Type d'issue
Bug
Difficulté
3/5
Temps estimé
1-2 jours
Activité
À l'abandon
Clarté
Clairement spécifiée
Accessibilité débutants
55/100

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.