In TypeScript sono supportati due tipi di enum:
Esistono anche enum eterogenei (tipi misti), ma il loro utilizzo è fortemente sconsigliato.
Esempio:
enum Status { Init, Loading, Ready = 5, Error } // Status.Error === 6 enum HttpCode { Ok = 200, NotFound = 404, Internal = 'INTERNAL_ERROR' // Errore! Solo stringhe o solo numeri } enum Direction { Up = 'UP', Down = 'DOWN', }
I valori costanti vengono calcolati al momento della compilazione. Se il valore ENUM dipende da altre elaborazioni o espressioni (ad esempio, una funzione), questo diventa un valore calcolato (computed member). Solo i membri precedenti dell'enum possono essere utilizzati per calcolare il membro attuale come valore predefinito.
Caratteristiche importanti:
È possibile utilizzare il valore di un altro enum durante la dichiarazione di un membro di un nuovo enum?
Risposta: Sì, ma solo se quel valore è una costante o un membro dichiarato in precedenza.
Esempio:
enum A { X = 1 } enum B { Y = A.X } // OK
Tuttavia, non è possibile utilizzare calcoli basati su funzioni o dati da altri luoghi (ad esempio, chiamate a funzioni).
Storia
In un progetto per la serializzazione dei dati in un API esterna è stato utilizzato un enum numerico. Quando è cambiato l'ordine dei membri dell'enum, i valori sono "saltati", e i sistemi esterni hanno iniziato a ricevere numeri diversi. Ciò ha causato stati errati nei client esterni, che era impossibile tracciare senza un audit del codice.
Storia
In un progetto React è stato erroneamente utilizzato un enum stringa e numerico in uno switch-case, aspettandosi che i valori fossero convertibili in stringhe. A causa della discrepanza, lo switch non funzionava correttamente e il componente restituiva un'interfaccia utente non valida.
Storia
Nel tentativo di creare un enum in cui parte dei valori è calcolata tramite una funzione, TypeScript non ha segnalato errori, ma in alcune build i valori risultavano undefined. Questo ha causato problemi di routing, quando l'enum è stato utilizzato come identificatore per i percorsi. Un errore critico si verificava solo nel bundle di produzione.