Validación de datos en TypeScript: de la teoría a la práctica
Uno de los problemas clave al desarrollar con TypeScript es la brecha entre la tipificación estática y los datos reales que provienen de fuentes externas (API, formularios, localStorage). TypeScript verifica los tipos en tiempo de compilación, pero en tiempo de ejecución los tipos desaparecen. La validación de datos es el proceso de verificar que los datos cumplan con reglas específicas en tiempo de ejecución, lo cual es fundamental para la fiabilidad de las aplicaciones.
En este artículo, analizaremos las bibliotecas más populares para la validación de datos en TypeScript: Zod, Yup, Joi y class-validator. Revisaremos sus características, ejemplos de uso y te ayudaremos a elegir la herramienta adecuada para tu proyecto.
¿Por qué no es suficiente solo TypeScript?
TypeScript es una herramienta para el desarrollador. Ayuda a escribir código más seguro, pero no protege contra:
- Datos incorrectos de una API (el campo
agepodría llegar como una cadena"25") - Campos obligatorios faltantes
- Formatos incorrectos (email, URL, teléfono)
- Valores fuera de los rangos permitidos
La validación de datos en tiempo de ejecución resuelve estos problemas, verificando los datos contra un esquema y proporcionando errores claros.
Zod — el estándar moderno
Zod es la biblioteca más popular para validación en TypeScript. Su principal ventaja es la estrecha integración con el sistema de tipos: se puede inferir un tipo automáticamente a partir del esquema.
Instalación
npm install zodEjemplo de uso
import { z } from 'zod';
// Definimos el esquemaconst UserSchema = z.object({ id: z.number().positive(), email: z.string().email(), age: z.number().min(18).max(120).optional(), role: z.enum(['admin', 'user', 'guest']),});
// Inferimos el tipo a partir del esquematype User = z.infer<typeof UserSchema>;
// Validaciónconst result = UserSchema.safeParse({ id: 1, email: 'user@example.com', age: 25, role: 'admin',});
if (result.success) { // result.data — datos correctos con tipo User console.log(result.data.email);} else { // result.error — información detallada sobre los errores console.log(result.error.format());}Características clave de Zod:
- Inferencia automática de tipos mediante
z.infer - Transformación de datos (por ejemplo, convertir cadenas a números)
- Validación de objetos y arrays anidados
- Soporte para union, intersection, discriminated unions
- Refinement — validaciones personalizadas
Yup — probado por el tiempo
Yup es una biblioteca de los autores de Formik. Ideal para la validación de formularios en React. Yup tiene una sintaxis más declarativa y un ecosistema rico.
Ejemplo
import * as yup from 'yup';
const schema = yup.object().shape({ name: yup.string().required('El nombre es obligatorio'), email: yup.string().email('Email inválido').required(), age: yup.number().positive().integer().min(18, 'La edad debe ser al menos 18'), tags: yup.array().of(yup.string()).min(1, 'Selecciona al menos una etiqueta'),});
schema.validate({ name: 'Iván', email: 'ivan@example.com', age: 25, tags: ['typescript'],}).then(validData => { console.log('Datos correctos:', validData);}).catch(err => { console.log('Error:', err.errors);});Características de Yup:
- Localización de mensajes de error
- Validación bajo demanda (lazy validation)
- Transformación de valores (cast)
- Integración con Formik de serie
Joi — potente y estricto
Joi es una biblioteca con un enorme conjunto de validadores. Originalmente creada para Node.js (Hapi.js), pero funciona muy bien también con TypeScript.
<
También en la biblioteca
Autorización y autenticación en C++: bibliotecas e implementación
Guía completa de Symfony/EventDispatcher para PHP con ejemplos
Procesamiento y edición de imágenes en TypeScript: Jimp, Sharp, Canvas