Kodokon kodokon.com

Enums et const assertions : les alternatives modernes

Comprenez les limites des enums et dérivez vos types depuis des constantes figées avec as const.

7 min · 3 questions

Ouvrir cette leçon dans Kodokon

Les enum font partie du langage depuis ses débuts, et vous en croiserez dans beaucoup de bases de code. Ils regroupent des constantes nommées sous un même type, utilisable à la fois comme valeur et comme annotation.

TYPESCRIPT
enum Role {
  User = "USER",
  Admin = "ADMIN",
}

function canDelete(role: Role): boolean {
  return role === Role.Admin;
}
Un enum de chaînes classique

Pourtant, l'écosystème moderne s'en détourne. Un enum est une syntaxe qui n'existe pas en JavaScript : le compilateur génère un objet à l'exécution, ce qui complique certains outils et est incompatible avec l'option erasableSyntaxOnly. L'alternative : un objet ordinaire figé avec as const, dont on dérive le type.

TYPESCRIPT
const ROLES = {
  User: "USER",
  Admin: "ADMIN",
} as const;

type Role = (typeof ROLES)[keyof typeof ROLES];

function canDelete(role: Role): boolean {
  return role === ROLES.Admin;
}
Objet as const et type dérivé, équivalent moderne

as const fonctionne aussi sur les tableaux : chaque élément devient un littéral en lecture seule, et (typeof SIZES)[number] produit l'union des valeurs. Une seule source de vérité alimente à la fois le code exécuté et les types.

TYPESCRIPT
const SIZES = ["sm", "md", "lg"] as const;

type Size = (typeof SIZES)[number];

function isSize(value: string): value is Size {
  return (SIZES as readonly string[]).includes(value);
}
Tableau as const : itérable au runtime, union au typage

Quiz de validation

Vérifiez que vous avez bien retenu les points clés de cette leçon.

  1. Quelle différence majeure sépare un enum d'un objet figé avec as const ?
    • L'enum est une syntaxe propre à TypeScript qui génère du code, l'objet as const reste du JavaScript ordinaire
    • L'objet as const est plus lent à l'exécution
    • L'enum ne peut contenir que des nombres
  2. Que produit as const appliqué au tableau ['sm', 'md'] ?
    • string[]
    • Un tuple en lecture seule de types littéraux
    • Un tableau modifiable de type Array<'sm' | 'md'>
    • Une erreur de compilation
  3. Comment obtenir l'union des valeurs d'un objet ROLES figé avec as const ?
    • keyof typeof ROLES
    • (typeof ROLES)[keyof typeof ROLES]
    • typeof ROLES