Verificación de existencia de un valor en Enum TypeScript: guía completa

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

¿Por qué verificar un valor en Enum TypeScript? Ejemplo práctico real

\n\n

Imagine: está escribiendo un backend en Node.js con TypeScript. El cliente envía el estado de un pedido — una cadena "shipped". Usted tiene un enum OrderStatus con las opciones: Pending, Processing, Shipped, Delivered. Pero de repente llega "CANCELLED" o "unknown". ¿Qué hacer? Correcto — verificar si el valor existe en el enum de TypeScript.

\n\n

Esta tarea es una de las más comunes en Stack Overflow (miles de visitas). Y con razón: el enum en TypeScript no es solo un conjunto de constantes, sino una bestia astuta con variantes numéricas y de cadena. En esta guía analizaremos todas las formas de verificar la presencia de un valor en un enum, desde las simples hasta las avanzadas, con ejemplos de código y explicaciones.

\n\n

Si recién está comenzando a aprender TypeScript o desea profundizar sus conocimientos, este artículo es para usted. ¡Vamos allá!

\n\n

¿Qué es un Enum en TypeScript? Breve introducción

\n\n

Un Enum (enumeración) es una forma de definir un conjunto de constantes con nombre. En TypeScript existen dos tipos de enum:

\n\n
    \n
  • Enums numéricos — los valores se incrementan automáticamente (0, 1, 2...).
  • \n
  • Enums de cadena — a cada miembro se le asigna explícitamente una cadena.
  • \n
\n\n

Ejemplo de enum numérico:

\n\n
enum Direction {\n    Up,    // 0\n    Down,  // 1\n    Left,  // 2\n    Right  // 3\n}
\n\n

Ejemplo de enum de cadena:

\n\n
enum Status {\n    Active = "ACTIVE",\n    Inactive = "INACTIVE",\n    Pending = "PENDING"\n}
\n\n

¿Por qué verificar un valor? Porque los datos externos (API, formularios, bases de datos) pueden ser cualquier cosa. Sin verificación, corre el riesgo de obtener undefined o un error en tiempo de ejecución.

\n\n

Método 1. El clásico: Object.values() + includes()

\n\n

La forma más popular y legible es convertir el enum en un array de valores y verificar la pertenencia con includes().

\n\n

Para enums de cadena:

\n\n
enum Color {\n    Red = "RED",\n    Green = "GREEN",\n    Blue = "BLUE"\n}\n\nfunction isColor(value: string): boolean {\n    return Object.values(Color).includes(value as Color);\n}\n\nconsole.log(isColor("RED"));    // true\nconsole.log(isColor("YELLOW")); // false
\n\n

Para enums numéricos — ¡un truco! Object.values() devuelve un mapeo inverso (claves y valores). Por lo tanto, es necesario filtrar solo los números:

\n\n
enum NumberEnum {\n    A = 1,\n    B = 2,\n    C = 3\n}\n\nfunction isNumberEnumValue(value: number): boolean {\n    return Object.values(NumberEnum).filter(v => typeof v === 'number').includes(value);\n}\n\nconsole.log(isNumberEnumValue(2)); // true\nconsole.log(isNumberEnumValue(5)); // false
\n\n

Este enfoque es universal, pero requiere cuidado con los enums numéricos. Ventaja: simple y claro. Desventaja: hay que recordar el filtrado.

\n\n

Método 2. Type Guard: verificación a través de las claves del enum

\n\n

Si no solo necesita verificar un valor, sino también obtener una garantía de tipo, use un type guard. Este método es especialmente útil al trabajar con API, donde desea restringir el tipo.

\n\n
enum UserRole {\n    Admin = "admin",\n    User = "user",\n    Guest = "guest"\n}\n\nfunction isUserRole(value: string): value is UserRole {\n    return Object.values(UserRole).includes(value as UserRole);\n}\n\nfunction processRole(role: string) {\n    if (isUserRole(role)) {\n        // TypeScript sabe que role es UserRole\n        console.log(`Rol: ${role}`);\n    } else {\n        console.log("Rol desconocido");\n    }\n}\n\nprocessRole("admin"); // Rol: admin\nprocessRole("moderator"); // Rol desconocido
\n\n

Este enfoque proporciona seguridad de tipos y reduce la cantidad de verificaciones en el código. Lo recomiendo para proyectos serios.

\n\n

Método 3. Helper personalizado

Blogs

Book Recommendations