Kodokon kodokon.com

Enums y aserciones const: las alternativas modernas

Comprende los límites de los enums y deriva tus tipos de constantes congeladas con as const.

7 min · 3 preguntas

Abrir esta lección en Kodokon

enum forma parte del lenguaje desde sus inicios, y te lo encontrarás en muchísimas bases de código. Agrupa constantes con nombre bajo un único tipo, utilizable tanto como valor como en una anotación.

TYPESCRIPT
enum Role {
  User = "USER",
  Admin = "ADMIN",
}

function canDelete(role: Role): boolean {
  return role === Role.Admin;
}
Un enum de cadenas clásico

Sin embargo, el ecosistema moderno se aleja de él. Un enum es sintaxis que no existe en JavaScript: el compilador emite un objeto en tiempo de ejecución, lo que complica ciertas herramientas y es incompatible con la opción erasableSyntaxOnly. La alternativa: un objeto sencillo congelado con as const, del que derivas el tipo.

TYPESCRIPT
const ROLES = {
  User: "USER",
  Admin: "ADMIN",
} as const;

type Role = (typeof ROLES)[keyof typeof ROLES];

function canDelete(role: Role): boolean {
  return role === ROLES.Admin;
}
Un objeto as const con un tipo derivado, el equivalente moderno

as const también funciona con arrays: cada elemento se convierte en un literal de solo lectura, y (typeof SIZES)[number] produce la unión de los valores. Una única fuente de verdad alimenta a la vez el código en ejecución y los tipos.

TYPESCRIPT
const SIZES = ["sm", "md", "lg"] as const;

type Size = (typeof SIZES)[number];

function isSize(value: string): value is Size {
  return (SIZES as readonly string[]).includes(value);
}
Un array as const: iterable en tiempo de ejecución, una unión a nivel de tipos

Prueba de conocimientos

Comprueba que has retenido los puntos clave de esta lección.

  1. ¿Qué diferencia importante separa a un enum de un objeto congelado con as const?
    • Un enum es sintaxis específica de TypeScript que genera código, mientras que un objeto as const sigue siendo JavaScript puro
    • Un objeto as const es más lento en tiempo de ejecución
    • Un enum solo puede contener números
  2. ¿Qué produce as const aplicado al array ['sm', 'md']?
    • string[]
    • Una tupla de solo lectura de tipos literales
    • Un array mutable de tipo Array<'sm' | 'md'>
    • Un error de compilación
  3. ¿Cómo obtienes la unión de los valores de un objeto ROLES congelado con as const?
    • keyof typeof ROLES
    • (typeof ROLES)[keyof typeof ROLES]
    • typeof ROLES