ProgrammazioneSviluppatore Fullstack

Come funziona la tipizzazione enum in TypeScript, quali sono i tipi di enum e qual è la differenza tra valori costanti e valori calcolati? Quali insidie possono sorgere nell'uso dell'enum?

Supera i colloqui con l'assistente IA Hintsage

Risposta

In TypeScript sono supportati due tipi di enum:

  • Numerico (numeric) — i valori predefiniti vengono assegnati in ordine, a partire da 0.
  • Stringa (string) — ogni valore deve essere specificato esplicitamente ed è una stringa.

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:

  • Gli enum numerici supportano la mappatura inversa enum → numero → stringa-nome.
  • Gli enum stringa — solo diretto (nome → valore).
  • Errore di compilazione quando si mescolano tipi in un singolo enum.

Domanda insidiosa

È 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).

Esempi di errori reali causati dalla mancanza di conoscenza delle sfumature dell'argomento.


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.