Decorator Metadata (Symbol.metadata)
TypeScript 🔴 SeniorDé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.
Termes liés
Fiche mise à jour le 2026-09-27