Enums y const enum en TypeScript | Nicolás Garzón
Inicio Wiki TypeScript Enums y const enum Volver a TypeScriptTypeScript
Enums y const enum Uso de enums numéricos, string enums y const enum, su representación en runtime y alternativas con objetos as const y union types.
Última actualización Actualizada 23 de jul de 2026
Un define un conjunto de miembros relacionados y, a diferencia de una literal union, normalmente crea también un objeto durante ejecución.
Nota anteriorNamespaces Nota siguiente Decorators enum
TypeScript
Copiar enum OrderStatus {
Pending,
Completed,
Cancelled,
}
TypeScript
Copiar enum Direction {
Up,
Down,
Left,
Right,
} Los valores comienzan en cero y se incrementan automáticamente.
TypeScript
Copiar Direction. Up;
Direction. Down; Puedes definir un inicio:
TypeScript
Copiar enum HttpStatus {
Ok = 200 ,
Created = 201 ,
NoContent = 204 ,
} TypeScript
Copiar console . log ( Direction) ; Los numeric enums suelen emitir un objeto con mapeo en ambas direcciones:
TypeScript
Copiar Direction[ Direction. Up] ;
Esta reverse mapping aumenta la salida y solo existe para miembros numéricos.
TypeScript
Copiar enum PaymentStatus {
Pending = "pending" ,
Approved = "approved" ,
Rejected = "rejected" ,
} Los valores son legibles al serializar y no tienen reverse mapping automática.
TypeScript
Copiar enum Mixed {
No = 0 ,
Yes = "YES" ,
} Es válido, pero mezcla dos representaciones y rara vez comunica un dominio claro. Prefiere un solo tipo de valor.
TypeScript
Copiar enum FileAccess {
None,
Read = 1 << 1 ,
Write = 1 << 2 ,
ReadWrite = Read | Write,
Generated = "abc" . length,
} Los miembros constantes pueden calcularse durante compilación. Los calculados dependen de una expresión evaluada en runtime y afectan qué miembros posteriores pueden omitir initializer.
TypeScript
Copiar function updateStatus ( status: OrderStatus) : void { } Cada miembro literal puede participar también como tipo:
TypeScript
Copiar type FinalStatus =
| OrderStatus. Completed
| OrderStatus. Cancelled; Cuando todos los miembros son literales, TypeScript conoce el conjunto cerrado y detecta comparaciones imposibles.
TypeScript
Copiar function process ( status: OrderStatus) : void {
if (
status !== OrderStatus. Pending ||
status !== OrderStatus. Completed
) {
}
} TypeScript
Copiar type DirectionName = keyof typeof Direction;
keyof Direction no consulta el objeto enum. Necesitas typeof para llevar el valor constructor al espacio de tipos.
TypeScript
Copiar type OrderStatus =
| "pending"
| "completed"
| "cancelled" ;
No emite JavaScript.
Se integra naturalmente con strings externos.
Se deriva fácilmente desde as const.
Crea nombres runtime.
Agrupa miembros bajo un objeto.
Puede interoperar con APIs que esperan códigos numéricos o una entidad enum concreta.
TypeScript
Copiar const OrderStatus = {
Pending: "pending" ,
Completed: "completed" ,
Cancelled: "cancelled" ,
} as const ;
type OrderStatus = (
typeof OrderStatus
) [ keyof typeof OrderStatus] ; Ofrece objeto runtime y literal union sin la emisión especial de enum.
Para muchas aplicaciones modernas esta alternativa es simple, compatible con JavaScript y fácil de serializar.
Los numeric enums han tenido históricamente compatibilidad permisiva con numbers. En versiones modernas, TypeScript asigna tipos únicos a miembros calculados y mejora la comprobación, pero una frontera externa sigue necesitando validar que el número corresponda a un miembro válido.
TypeScript
Copiar function parseDirection ( value: unknown ) : Direction {
if (
typeof value !== "number" ||
! ( value in Direction)
) {
throw new TypeError ( "Invalid direction" ) ;
}
return value;
} Con reverse mapping, in también encuentra nombres string; limita primero el tipo esperado.
TypeScript
Copiar const enum Direction {
Up,
Down,
}
const direction = Direction. Up; El compilador puede inlinear el valor y eliminar el objeto enum.
JavaScript
Copiar const direction = 0 ;
Menor objeto runtime.
Acceso reemplazado por constantes.
Útil dentro de un proyecto controlado y compilado junto.
Un consumidor puede compilar contra una versión del .d.ts e instalar otra versión runtime. Los valores inlineados pueden quedar desalineados.
También crea problemas con herramientas que transpilan de forma aislada y no pueden resolver declarations externas de forma completa.
Por eso evita publicar ambient const enums en librerías salvo una estrategia muy controlada.
JSON
Copiar {
"compilerOptions" : {
"preserveConstEnums" : true
}
} Conserva el objeto runtime de const enums de forma parecida a enums normales. El propio proyecto TypeScript puede eliminar const de declarations publicadas para evitar que consumidores inlineen valores externos.
Los ambient const enums son incompatibles con varios flujos de isolatedModules, porque el transformador por archivo no puede conocer sus valores con seguridad.
TypeScript
Copiar declare enum LegacyStatus {
Pending,
Completed,
} Describe un objeto enum proporcionado externamente. Los miembros sin initializer se consideran calculados bajo reglas ambient y deben coincidir con el runtime.
TypeScript
Copiar enum Permission {
None = 0 ,
Read = 1 << 0 ,
Write = 1 << 1 ,
Delete = 1 << 2 ,
}
const permissions = Permission. Read | Permission. Write; Los numeric enums pueden expresar flags, pero documenta operaciones y valida combinaciones.
TypeScript
Copiar enum NativeErrorCode {
NotFound = 1 ,
PermissionDenied = 2 ,
Timeout = 3 ,
} Tiene sentido cuando una API externa utiliza códigos numéricos estables y los nombres mejoran legibilidad interna.
Creer que enum es solo un tipo.
Esperar reverse mapping en string enums.
Usar números incrementales en datos persistidos sin fijar valores.
Mezclar strings y numbers.
Elegir enum cuando una literal union basta.
Publicar const enums sin considerar version skew.
Usar const enum con herramientas aisladas incompatibles.
Confiar en el tipo para validar un código externo.
Cambiar el orden de miembros numéricos y romper datos guardados.
Enum suele crear un objeto runtime y un tipo.
Numeric enums pueden auto-incrementar y tener reverse mapping.
String enums son más legibles al intercambiar datos.
keyof typeof Enum obtiene nombres de miembros.
Literal unions y objetos as const son alternativas comunes.
const enum puede inlinear valores.
Publicar const enums añade riesgos de tooling y versiones.
Los datos externos siguen necesitando validación.
¿Por qué cambiar el orden de un numeric enum puede romper datos persistidos?
Respuesta Porque los miembros sin initializer reciben números según su posición. Al reordenarlos, el mismo número guardado puede pasar a representar otro miembro.
Decorators explica metaprogramación runtime y diferencia el estándar moderno del sistema legacy.