En TypeScript se soportan dos tipos de enum:
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:
¿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).
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.