Achtergrond:
Enum — een type dat afkomstig is uit C/C++ en andere talen, voor het beschrijven van eindige verzamelingen van benoembare constanten. In JavaScript bestonden ze niet, maar TypeScript biedt ondersteuning. Voor prestatieverbetering is const enum uitgevonden — een uitbreiding waarbij de waarden rechtstreeks tijdens de compilatie worden ingevoegd, en niet als volwaardige objecten.
Probleem:
Gewone enum genereert in JS een aanzienlijke hoeveelheid ondersteunende code (objecten die de bidirectionele koppeling naam<->waarde verzorgen). Dit is niet altijd nodig, vooral als maximale prestaties en minimale bundelgrootte belangrijk zijn.
Oplossing:
Gebruik const enum wanneer het nodig is om waarden in te line tijdens de compilatie en overbodige code te vermijden. Echter, const enum heeft beperkingen — ze werken alleen binnen een TypeScript-project, zijn moeilijk te gebruiken bij transpiling naar verschillende modules, en kunnen problemen veroorzaken met tree shaking en import/export.
Voorbeeldcode:
const enum Direction { Up, Down, Left, Right } const move = Direction.Left; // Wordt in JS simpelweg 2
Belangrijkste kenmerken:
Kan const enum gebruikt worden in d.ts-bestanden en openbare bibliotheken?
Nee. Het wordt aanbevolen om const enum in bibliotheken te vermijden, omdat ze alleen tijdens de compilatie worden ingelined, wat vaak fouten veroorzaakt bij hercompilatie en het beschrijven van types.
Wat gebeurt er bij het gebruik van const enum met de parameter isolatedModules of bij compilatie met babel?
Er zal een fout optreden: babel en isolatedModules ondersteunen geen inlining van const enum, omdat ze geen veilige vervangingen van waarden kunnen garanderen tijdens de compilatiefase van één bestand.
Kunnen berekende waarden en stringwaarden in const enum worden gebruikt?
Complexe berekeningen (bijvoorbeeld expressies via functies of variabelen) zijn verboden. Alleen eenvoudige nummers en strings zijn toegestaan.
Een const enum gepubliceerd in een bibliotheek, beschreven in .d.ts, de consument ontving een fout vanwege het ontbreken van de importstring in de uiteindelijke bundel.
Voordelen:
Nadelen:
Gebruik van const enum alleen binnen privéonderdelen van het project, zonder het naar buiten te exporteren:
const enum Color { Red, Green, Blue } let arr = [Color.Red, Color.Green];
Voordelen:
Nadelen: