Historia de la cuestión:
El enum es un tipo que proviene de C/C++ y otros lenguajes, utilizado para describir conjuntos finitos de constantes nombradas. No existían en JavaScript, pero TypeScript implementó soporte para ellos. Para mejorar el rendimiento se ideó el const enum: una extensión en la que los valores se insertan directamente en tiempo de compilación, en lugar de como objetos completos.
Problema:
Los enums normales generan una cantidad significativa de código auxiliar en JS (objetos que garantizan la relación bidireccional nombre<->valor). Esto no siempre es necesario, especialmente si la máxima performance y el tamaño mínimo del bundle son importantes.
Solución:
Usar const enum si es necesario insertar valores en la compilación y evitar código innecesario. Sin embargo, los const enum tienen limitaciones: solo funcionan dentro de proyectos de TypeScript, son difíciles de utilizar al transpilar en diferentes módulos, y pueden haber problemas con tree shaking y import/export.
Ejemplo de código:
const enum Direction { Up, Down, Left, Right } const move = Direction.Left; // En JS se convertirá simplemente en 2
Características clave:
¿Se puede usar const enum en archivos d.ts y bibliotecas de uso general?
No. Se recomienda evitar const enum en bibliotecas, ya que solo se insertan en la compilación, y esto a menudo causa errores en recompilaciones y descripciones de tipos.
¿Qué sucederá al usar const enum con el parámetro isolatedModules o al compilar con babel?
Surgirá un error: babel e isolatedModules no admiten la inserción de const enum, ya que no pueden garantizar la sustitución segura de valores en la etapa de compilación de un solo archivo.
¿Se pueden usar valores calculados y valores de cadena en const enum?
Cálculos complejos (por ejemplo, expresiones a través de funciones o variables) están prohibidos. Solo se admiten números y cadenas simples.
Se publicó un const enum en la biblioteca, se describió en .d.ts, el consumidor recibió un error por la falta de la cadena de importación en el bundle final.
Ventajas:
Desventajas:
Se utilizó const enum solo dentro de partes privadas del proyecto, sin exportarlo:
const enum Color { Red, Green, Blue } let arr = [Color.Red, Color.Green];
Ventajas:
Desventajas: