Historique de la question :
L'enum est un type provenant de C/C++ et d'autres langages pour décrire des ensembles finis de constantes nommées. En JavaScript, il n'existait pas, mais TypeScript a implémenté un support. Pour améliorer la performance, le const enum a été introduit — une extension où les valeurs sont substituées directement au moment de la compilation, et non comme de véritables objets.
Problème :
Les enums classiques génèrent dans JS un volume significatif de code auxiliaire (objets assurant la liaison bidirectionnelle nom<->valeur). Ce n'est pas toujours nécessaire, surtout si la performance maximale et la taille minimale du bundle sont cruciales.
Solution :
Utiliser const enum si l'on souhaite intégrer les valeurs lors de la compilation et éviter le code superflu. Cependant, le const enum a des limitations — il ne fonctionne que dans le cadre d'un projet TypeScript, il est difficile à utiliser lors de la transpilation vers différents modules, et il peut y avoir des problèmes avec le tree shaking et l'import/export.
Exemple de code :
const enum Direction { Up, Down, Left, Right } const move = Direction.Left; // Se transforme simplement en 2 dans JS
Caractéristiques clés :
Peut-on utiliser const enum dans des fichiers d.d.ts et des bibliothèques publiques ?
Non. Il est recommandé d'éviter les const enum dans les bibliothèques, car ils sont intégrés uniquement lors de la compilation, ce qui entraîne souvent des erreurs lors de la reconstruction et de la description des types.
Que se passe-t-il lorsque l'on utilise const enum avec le paramètre isolatedModules ou lors de la compilation avec babel ?
Une erreur se produira : babel et isolatedModules ne prennent pas en charge l'inlining des const enum, car ils ne peuvent garantir un remplacement sécurisé des valeurs au moment de la compilation d'un fichier.
Peut-on utiliser des valeurs calculées et des valeurs string dans const enum ?
Les calculs complexes (par exemple, des expressions via des fonctions ou des variables) sont interdits. Seules des nombres simples et des chaînes de caractères sont autorisés.
Publication d'un const enum dans une bibliothèque, description dans un .d.ts, le consommateur a reçu une erreur due à l'absence d'une ligne d'importation dans le bundle final.
Avantages :
Inconvénients :
Utilisation de const enum uniquement dans les parties privées du projet, sans exportation :
const enum Color { Red, Green, Blue } let arr = [Color.Red, Color.Green];
Avantages :
Inconvénients :