Cómo convertir una cadena a enum en TypeScript: guía paso a paso
\n\n¿Alguna vez se ha encontrado con una situación en la que una API devuelve una cadena, pero su modelo de TypeScript está estrictamente tipado mediante un enum? ¿O quizás recibe un valor de localStorage y desea convertirlo de forma segura a una enumeración? Si es así, ha llegado al lugar correcto. En este artículo, analizaremos cómo convertir una cadena a enum en TypeScript, desde soluciones simples hasta técnicas avanzadas con manejo de errores.
Este tema es uno de los más populares en Stack Overflow (¡miles de visitas!), y no es casualidad. Incluso los desarrolladores experimentados a menudo se confunden cuando se trata de convertir cadenas a enumeraciones de forma segura. Vamos a desglosarlo todo.
\n\n¿Qué es un enum en TypeScript y por qué convertirlo?
\n\nUn enum (enumeración) es una poderosa herramienta de TypeScript que permite definir un conjunto de constantes con nombre. En lugar de usar "cadenas mágicas" como 'active' o 'pending', usted define un enum y trabaja con valores tipados. Pero aquí está el problema: los datos de fuentes externas (API, formularios, archivos de configuración) a menudo llegan como cadenas comunes. Y entonces surge la pregunta: ¿cómo convertir una cadena a enum en TypeScript de forma segura y elegante?
// Ejemplo de enum\nenum Status {\n Active = 'active',\n Inactive = 'inactive',\n Pending = 'pending'\n}\n\n// Cadena de la API\nconst apiStatus: string = 'active';\n// ¿Cómo obtener Status.Active? 🤔\n\nMétodo 1: Aserción de tipo directa (Type Assertion)
\n\nEl método más simple, pero también el más peligroso. Simplemente le dice a TypeScript: "Confía en mí, este es el valor correcto".
\n\nconst status = apiStatus as Status;\n// o\nconst status = <Status>apiStatus;\n\nVentaja: Mínimo código. Desventaja: Si la cadena no coincide con ningún valor del enum, obtendrá undefined sin advertencia. TypeScript no lanzará un error, y se enterará del problema solo en tiempo de ejecución, cuando algo falle.
Este método solo debe usarse si está absolutamente seguro de la fuente de datos. Para producción, no se recomienda.
\n\nMétodo 2: Uso de una función utilitaria personalizada
\n\nEste es el punto medio entre simplicidad y seguridad. Escribamos una función que tome una cadena y verifique si ese valor existe en el enum.
\n\nfunction stringToEnum<T>(value: string, enumObject: T): T[keyof T] | undefined {\n // Verificamos si el valor está en el enum\n const enumValues = Object.values(enumObject) as string[];\n if (enumValues.includes(value)) {\n return value as unknown as T[keyof T];\n }\n return undefined;\n}\n\n// Uso\nconst status = stringToEnum(apiStatus, Status);\nif (status) {\n console.log(status); // Status.Active\n} else {\n console.error('Valor de estado incorrecto');\n}\n\nEsta función convierte de forma segura una cadena a enum en TypeScript. Si no se encuentra el valor, devuelve undefined, y usted puede manejar ese caso. Observe el genérico <T> — hace que la función sea universal para cualquier enum.
Método 3: Enfoque estricto con lanzamiento de error
\n\nA veces, undefined no es lo que necesita. Es mejor lanzar un error explícitamente para detectar el problema rápidamente.
function stringToEnumStrict<T>(value: string, enumObject: T): T[keyof T] {\n const enumValues = Object.values(enumObject) as string[];\n if (enumValues.includes(value)) {\n return value as unknown as T[keyof T];\n }\n throw new Error(`El valor "${value}" no se encontró en el enum`);\n}\n\n// Uso\ntry {\n const status = stringToEnumStrict(apiStatus, Status);\n // Trabajamos con status\n} catch (error) {\n console.error(error.message);\n // Registramos el error en Sentry u otro sistema de monitoreo\n}