Storia della questione:
Enum — tipo derivato da C/C++ e altri linguaggi, utilizzato per descrivere insiemi finiti di costanti nominate. Non esistevano in JavaScript, ma TypeScript ne implementa il supporto. Per migliorare le prestazioni è stato inventato il const enum — un'estensione in cui i valori vengono sostituiti direttamente durante la compilazione, e non come oggetti a pieno titolo.
Problema:
Gli enum normali generano in JS un considerevole volume di codice ausiliario (oggetti che garantiscono la connessione bidirezionale nome<->valore). Questo non è sempre necessario, soprattutto se l'obiettivo è massimizzare le prestazioni e ridurre la dimensione del bundle.
Soluzione:
Utilizzare const enum se è necessario inlineare i valori durante la compilazione e evitare codice superfluo. Tuttavia, i const enum hanno limitazioni: funzionano solo all'interno di progetti TypeScript, sono difficili da utilizzare durante la transpilation in diversi moduli e potrebbero esserci problemi con il tree shaking e import/export.
Esempio di codice:
const enum Direction { Up, Down, Left, Right } const move = Direction.Left; // In JS diventerà semplicemente 2
Caratteristiche principali:
È possibile utilizzare il const enum nei file d.ts e nelle librerie di uso comune?
No. Si raccomanda di evitare const enum nelle librerie, poiché vengono inlineati solo durante la compilazione, il che spesso provoca errori durante la ricompilazione e la descrizione dei tipi.
Cosa succede utilizzando const enum con il parametro isolatedModules o compilando con babel?
Si verifica un errore: babel e isolatedModules non supportano l'inlining dei const enum, poiché non possono garantire una sostituzione sicura dei valori durante la compilazione di un singolo file.
Possono essere utilizzati valori calcolati e valori stringa nei const enum?
Calcoli complessi (ad esempio, espressioni tramite funzioni o variabili) sono vietati. Possono essere utilizzati solo numeri semplici e stringhe.
È stato pubblicato un const enum in una libreria, descritto in .d.ts, e il consumatore ha ricevuto un errore a causa dell'assenza di una stringa di importazione nel bundle finale.
Pro:
Contro:
Sono stati utilizzati const enum solo all'interno delle parti private del progetto, senza esportarli all'esterno:
const enum Color { Red, Green, Blue } let arr = [Color.Red, Color.Green];
Pro:
Contro: