ProgramaciónDesarrollador Fullstack

¿Cómo funciona la tipificación de enum en TypeScript, qué tipos de enum existen y en qué se diferencian los valores constantes de los calculados? ¿Qué problemas pueden surgir al utilizar enum?

Supere entrevistas con el asistente de IA Hintsage

Respuesta

En TypeScript se soportan dos tipos de enum:

  • Numéricos (numeric) — los valores por defecto se asignan en orden, comenzando desde 0.
  • De cadena (string) — cada valor debe ser asignado explícitamente y es una cadena.

También existen enum heterogéneos (tipos mixtos), pero su uso es extremadamente desaconsejado.

Ejemplo:

enum Status { Init, Loading, Ready = 5, Error } // Status.Error === 6 enum HttpCode { Ok = 200, NotFound = 404, Internal = 'INTERNAL_ERROR' // ¡Error! Solo cadenas o solo números } enum Direction { Up = 'UP', Down = 'DOWN', }

Los valores constantes se calculan en el momento de la compilación. Si el valor ENUM depende de otros cálculos o expresiones (por ejemplo, una función), se convierte en un valor calculado (computed member). Solo los miembros anteriores del enum pueden ser utilizados para calcular el miembro actual como valor por defecto.

Características importantes:

  • Los enum numéricos soportan la reversibilidad enum → número → cadena-nombre.
  • Los enum de cadena — solo la directa (nombre → valor).
  • Errores de compilación al mezclar tipos en un mismo enum.

Pregunta tramposa

¿Se puede usar el valor de otro enum al declarar un miembro de un nuevo enum?

Respuesta: Sí, pero solo si ese valor es una constante o un miembro declarado anteriormente.

Ejemplo:

enum A { X = 1 } enum B { Y = A.X } // OK

Sin embargo, no se pueden usar cálculos basados en funciones o datos de otros lugares (por ejemplo, llamadas a funciones).

Ejemplos de errores reales debido al desconocimiento de los matices del tema.


Historia

En un proyecto para la serialización de datos a una API externa se utilizó un enum numérico. Al cambiar el orden de los miembros del enum, los valores "desaparecieron", y los sistemas externos comenzaron a recibir otros números. Esto causó estados incorrectos en los clientes externos, que no podían ser rastreados sin una auditoría del código.


Historia

En un proyecto de React se usaron erróneamente un enum de cadena y un enum numérico en switch-case, esperando que los valores se convirtieran a cadenas. Debido a la discrepancia, el switch no funcionó correctamente y el componente devolvió una UI no válida.


Historia

Al intentar hacer un enum donde parte de los valores se calculan a través de una función, TypeScript no dio advertencias, pero en algunas compilaciones los valores resultaron ser undefined. Esto causó problemas con el enrutamiento, cuando el enum se utilizó como identificador para las rutas. Un error crítico solo se reprodujo en el bundle de producción.