ProgrammatieFullstack ontwikkelaar

Hoe werkt de enum-typificatie in TypeScript, welke soorten enum's zijn er en wat is het verschil tussen constante en berekende waarden? Welke valkuilen kunnen zich voordoen bij het gebruik van enum's?

Slaag voor sollicitatiegesprekken met de Hintsage AI-assistent

Antwoord

In TypeScript worden er twee soorten enum ondersteund:

  • Numerieke (numeric) — standaardwaarden worden in volgorde toegewezen, beginnend vanaf 0.
  • Tekenreeks (string) — elke waarde moet expliciet worden opgegeven en is een tekenreeks.

Er zijn ook heterogene enum's (gemengde typen), maar het gebruik daarvan wordt sterk afgeraden.

Voorbeeld:

enum Status { Init, Loading, Ready = 5, Error } // Status.Error === 6 enum HttpCode { Ok = 200, NotFound = 404, Internal = 'INTERNAL_ERROR' // Fout! Alleen tekenreeksen of alleen getallen } enum Direction { Up = 'UP', Down = 'DOWN', }

Constante waarden worden berekend tijdens de compilatiefase. Als een ENUM-waarde afhankelijk is van andere berekeningen of expressies (bijvoorbeeld een functie), wordt dit een berekende waarde (computed member). Alleen eerdere leden van de enum kunnen worden gebruikt om het huidige lid als standaardwaarde te berekenen.

Belangrijke kenmerken:

  • Numerieke enum's ondersteunen omgekeerde mapping enum → nummer → string-naam.
  • Tekenreeks enum's — alleen directe (naam → waarde).
  • Compilatiefouten bij het mengen van typen in één enum.

Vraag met een valstrik

Kan de waarde van een andere enum worden gebruikt bij het declareren van een lid van een nieuwe enum?

Antwoord: Ja, maar alleen als deze waarde een constante is of een eerder gedeclareerd lid.

Voorbeeld:

enum A { X = 1 } enum B { Y = A.X } // OK

Echter, je kunt geen berekeningen gebruiken die gebaseerd zijn op functies of gegevens uit andere plaatsen (bijvoorbeeld functie-aanroepen).

Voorbeelden van echte fouten door onwetendheid over de nuances van het onderwerp.


Verhaal

In een project voor het serialiseren van gegevens naar een externe API werd een numerieke enum gebruikt. Bij het veranderen van de volgorde van de leden in de enum "vervlogen" de waarden, en externe systemen begonnen andere getallen te ontvangen. Dit veroorzaakte onjuiste toestanden bij externe klanten, die niet konden worden opgespoord zonder een code-audit.


Verhaal

In een React-project werd per ongeluk de string- en numerieke enum in een switch-case gebruikt, in de veronderstelling dat de waarden naar tekenreeksen konden worden omgezet. Door de inconsistentie werkte de switch niet correct en gaf de component een ongeldige UI terug.


Verhaal

Bij het proberen om een enum te maken, waarbij een deel van de waarden via een functie werd berekend, gaf TypeScript geen foutmelding, maar in een aantal builds bleken de waarden undefined te zijn. Dit leidde tot problemen met routing, wanneer de enum als identificator voor paden werd gebruikt. Een kritieke fout trad alleen op in de production bundle.