TypeScript-enum: numeric, string, const en de alternatieven | We.Inc
Genereer numeric, string en const enums van uw eigen membernamen, bekijk de exacte JavaScript die elk oplevert, en vergelijk ze met as const-objecten en literal unions.
Een enum geeft een set benoemde constanten één type. Numeric enums tellen op vanaf 0 en koppelen getallen ook terug aan namen; string enums hebben per member een literal nodig en hebben geen reverse mapping; const enums worden inline gezet en verdwijnen. Anders dan het meeste TypeScript leveren gewone enums echte JavaScript op, en daarom kiezen veel teams liever voor as const-objecten.
Vijf manieren om een vaste set waarden te modelleren
Stijl
Levert JavaScript op?
Reverse mapping
Accepteert een losse literal?
Numeric enum
Ja, een object
Ja, van getal naar naam
Getallen die bij een member passen
String enum
Ja, een object
Nee
Nee, gebruik Enum.Member
const enum
Nee, waarden inline gezet
Nee
Zoals de bijbehorende enumsoort
as const-object
Ja, een gewoon object
Nee (schrijf er een als dat nodig is)
Ja
Union van literals
Nee, verwijderd
Nee
Ja
Typ membernamen in de generator en wissel tussen stijlen. Hij schrijft de TypeScript-declaratie en de JavaScript die de compiler zou opleveren, zodat u de kosten van elke keuze ziet voordat ze in uw bundle belanden.
Voer membernamen in, gescheiden door komma's, bijvoorbeeld Draft, Review, Live.
Stel voor numeric enums het startgetal in; latere members tellen daarvandaan verder.
Kies een stijl om de declaratie, de opgeleverde JavaScript en het gebruik te zien.
Kopieer de versie die bij uw project past.
Kies string enums of as const-objecten voor waarden die uw programma verlaten, zoals API-velden of databasekolommen. Een logregel met live leest makkelijker dan 2.
Herschik nooit members en voeg er geen in het midden toe in een numeric enum die ergens wordt opgeslagen. Elk later getal verschuift en oude opgeslagen data betekent dan iets anders.
Vermijd const enum in gepubliceerde bibliotheken. Gebruikers die compileren met isolatedModules of een type stripper kunnen geen waarden uit een ander bestand inline zetten.
Zet erasableSyntaxOnly aan als u .ts-bestanden draait met type stripping in Node; het markeert enums voordat ze tijdens runtime falen.
Veelgestelde vragen
Wat is een reverse mapping?
Voor numeric enums slaat tsc beide richtingen op het object op, dus Direction.Up is 0 en Direction[0] is de string Up. String members krijgen geen omgekeerde vermelding, omdat de waarde zou kunnen botsen met de naam van een ander member.
Waarom kan ik geen gewone string doorgeven aan een functie die een string enum verwacht?
String enum-members zijn aparte types. De compiler meldt dat de literal niet toewijsbaar is aan de enum, dus aanroepers moeten Status.Draft schrijven. Als u wilt dat aanroepers de literal kunnen doorgeven, gebruik dan een union van string literals.
Hoe loop ik over de waarden van een enum?
Voor een string enum geeft Object.values(MyEnum) de waarden terug. Voor een numeric enum bevat het object ook de omgekeerde keys, dus filter: Object.values(MyEnum).filter((v) => typeof v === 'number').
Zijn enums verouderd?
Nee. Ze blijven onderdeel van TypeScript. Met de nieuwere optie erasableSyntaxOnly, toegevoegd in TypeScript 5.8, kunnen projecten die op type stripping vertrouwen ze verbieden, omdat een enum niet kan worden verwijderd door alleen annotaties te schrappen.
Draait Node.js bestanden met enums direct?
Niet met de standaard type stripping. De documentatie van Node noemt enum-declaraties bij de functies die codegeneratie nodig hebben en in die modus niet worden ondersteund, dus compileer ze met tsc of een andere transformer, of stap over op een as const-object.
Numeric enums: compact maar kwetsbaar
Zonder initialisatie worden members op volgorde genummerd als 0, 1, 2. Geef de eerste een waarde, zoals Low = 1, en de rest telt daarvandaan verder. Het opgeleverde object bevat zowel naam naar getal als getal naar naam.
Die compactheid is ook het risico. De getallen betekenen niets buiten uw code, en een member in het midden toevoegen nummert alles daarna stilletjes opnieuw.
String enums: leesbaar en strikt
Elk member heeft een string literal nodig, waardoor waarden zichzelf beschrijven in logs, URL's en JSON. De striktheid werkt twee kanten op: een waarde die uit een API wordt gelezen is een string, niet de enum, dus u hebt nog steeds een controle nodig voordat u haar als enum behandelt.
Het as const-patroon
Een object literal gemarkeerd met as const behoudt de exacte stringwaarden als types. Combineer het met type Role = (typeof Role)[keyof typeof Role] en u krijgt een runtime-object om over te itereren plus een union type dat zowel Role.Admin als de literal admin accepteert.
Dit is gewone JavaScript met annotaties, dus elke type stripper kan ermee overweg, en er wordt niets extra gegenereerd naast het object dat u hebt geschreven.
De drie soorten enums en wat ze opleveren
Numeric enum met een startwaarde
Mid en High tellen verder vanaf Low. Het opgeleverde object koppelt in beide richtingen.
String enum
Elk member wordt één keer toegewezen, zonder omgekeerde vermelding.
const enum
De declaratie verdwijnt en elk gebruik wordt vervangen door de waarde.
Verwijderbare alternatieven
as const-object plus een afgeleide union
Werkt met type strippers, itereert met Object.values en accepteert de losse string.
Gewone union als er geen runtime-lijst nodig is
Volledig verwijderd; de compiler weigert nog steeds elke andere string.
Enums verbieden in een project met type stripping
Met deze optie is een enum-declaratie een compileerfout.
Numeric enum
String enum
const enum
as const-object
Union type
Enum-generator
Typenaam
Members (gescheiden door komma's)
Eerste getal
Enumstijl
TypeScript
Opgeleverde JavaScript
TypeScript kopiëren
JavaScript kopiëren
Gebruik namen die beginnen met een letter, $ of _, en alleen letters, cijfers, $ of _ bevatten, zonder dat een naam twee keer voorkomt.