ProgramaciónDesarrollador Frontend

¿Para qué sirven y cómo funcionan los const enum en TypeScript? ¿En qué se diferencian de los enum normales y cuáles son las trampas y limitaciones en su uso?

Supere entrevistas con el asistente de IA Hintsage

Respuesta.

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:

  • Los valores se insertan directamente sin generar un objeto enum.
  • No se admiten valores complejos o cálculos en el cuerpo del enum.
  • No exportables (mayoritariamente errores al usarlos en bibliotecas o con isolatedModules).

Preguntas capciosas.

¿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.

Errores típicos y anti-patrones

  • Uso de const enum en la API pública de una biblioteca o en archivos .d.ts.
  • Transpilación sin soporte para la inserción de const enum (por ejemplo, a través de babel sin un plugin especial).
  • Agregar expresiones complejas y valores de cadena en lugar de simples.

Ejemplo de la vida real

Caso negativo

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:

  • Ejecución rápida, no hay código extra en proyectos dependientes.

Desventajas:

  • Errores de compilación y runtime para los usuarios.

Caso positivo

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:

  • Código JS de salida compacto.
  • Garantía de seguridad y facilidad de mantenimiento.

Desventajas:

  • No se puede exportar hacia afuera.