Decorator Metadata (Symbol.metadata)

TypeScript 🔴 Senior

Définition

Depuis TypeScript 5.2, chaque décorateur standard reçoit context.metadata, un objet partagé par tous les décorateurs d'une même classe et exposé ensuite via Classe[Symbol.metadata]. Il remplace reflect-metadata pour attacher des informations (sérialisation, validation) lisibles à l'exécution. La proposition TC39 « Decorator Metadata » est au Stage 2.7 au 27 septembre 2026 ; un polyfill Symbol.metadata ??= Symbol('metadata') est requis.

Analogie

Le carnet de bord agrafé au dossier de la classe, où chaque décorateur écrit sa note.

Exemple de code

Symbol.metadata ??= Symbol('Symbol.metadata'); // polyfill

function serialisable(_: unknown, ctx: ClassFieldDecoratorContext) {
  (ctx.metadata.champs ??= [] as string[]).push(String(ctx.name));
}
class Utilisateur {
  @serialisable nom = '';
  @serialisable email = '';
  motDePasse = '';
}
Utilisateur[Symbol.metadata]!.champs; // ['nom', 'email']

Cas d'usage

ORM, validation, sérialisation sélective, injection de dépendances sans reflect-metadata.

Anti-pattern

Mélanger emitDecoratorMetadata (legacy) et Symbol.metadata : deux mécanismes incompatibles.
#advanced#ts5.2#decorators

Fiche mise à jour le 2026-09-27

← → au clavier pour passer d'une fiche à l'autre