Skip to content

Lección 75 — Enums

Los enums (enumeraciones) permiten definir un conjunto de constantes con nombre. Son útiles para representar opciones fijas como estados, direcciones, tipos de usuario, etc.

enum Direccion {
Norte, // 0
Sur, // 1
Este, // 2
Oeste // 3
}
let direccion: Direccion = Direccion.Norte;
console.log(direccion); // → 0

El primer miembro empieza en 0 y los siguientes se incrementan automáticamente.

enum StatusCode {
Success = 200,
NotFound = 404,
Error = 500
}
enum Color {
Rojo = 'ROJO',
Verde = 'VERDE',
Azul = 'AZUL'
}
let color: Color = Color.Rojo;
console.log(color); // → 'ROJO'

Mezclar strings y números está permitido pero no se recomienda:

enum Mezclado {
Si = 1,
No = 'NO' // posible, pero confuso
}

Los const enum se eliminan en la compilación y sus valores se inyectan directamente donde se usan. Esto reduce el runtime:

const enum Talla {
Pequena = 'S',
Mediana = 'M',
Grande = 'L'
}
let camiseta: Talla = Talla.Mediana;
// Se compila como: let camiseta = "M";
enum EstadoPedido {
Pendiente = 1,
Confirmado,
Enviado,
Entregado,
Cancelado
}
function actualizarEstado(actual: EstadoPedido, nuevo: EstadoPedido): EstadoPedido {
if (actual === EstadoPedido.Cancelado) {
throw new Error('No se puede cambiar un pedido cancelado');
}
return nuevo;
}
let estado = EstadoPedido.Pendiente;
estado = actualizarEstado(estado, EstadoPedido.Confirmado);
console.log(EstadoPedido[estado]); // → 'Confirmado' (reverse mapping)

Crea un enum Rol con valores de string: Admin = 'ADMIN', Editor = 'EDITOR', Visor = 'VISOR'. Escribe una función tienePermiso(rol: Rol, accion: string): boolean que devuelva true si el rol tiene permiso para una acción (define las reglas que quieras, por ejemplo Admin puede todo, Editor puede editar/ver, Visor solo ver).

Los enums numéricos tienen reverse mapping: puedes obtener el nombre a partir del valor (EstadoPedido[1]'Pendiente'). Los enums de string no tienen esta característica.

Si solo necesitas agrupar constantes sin comportamiento especial, considera usar union types en lugar de enums (type Estado = 'pendiente' | 'confirmado' | 'enviado'). Son más ligeros y más fáciles de componer. Usa enums cuando necesites iterar sobre los valores o usar reverse mapping.