Validación de datos en TypeScript: resumen de las bibliotecas Zod, Yup e io-ts
TypeScript es un lenguaje de tipado estático que verifica los tipos en tiempo de compilación. Sin embargo, en tiempo de ejecución (runtime), TypeScript no realiza ninguna verificación. Esto significa que los datos obtenidos de fuentes externas —solicitudes API, formularios de entrada, archivos de configuración— pueden no coincidir con los tipos esperados. Para solucionar este problema, se utilizan bibliotecas de validación de datos que verifican la estructura y los tipos de datos en tiempo de ejecución.
En este artículo, analizaremos tres bibliotecas populares para la validación de datos en TypeScript: Zod, Yup e io-ts. Aprenderá cómo funcionan, cuáles son sus diferencias y cómo elegir la adecuada para su proyecto.
¿Por qué es necesaria la validación de datos en TypeScript?
Imagine que está escribiendo una aplicación que recibe datos de un usuario a través de un formulario:
interface UserInput { name: string; age: number; email: string;}
function processUserInput(input: UserInput) { console.log(input.name.toUpperCase());}En TypeScript, este código se compilará incluso si en tiempo de ejecución input.name resulta ser undefined o un número. Esto provocará un error difícil de detectar. Las bibliotecas de validación permiten garantizar que los datos coincidan con el esquema esperado y proporcionan mensajes de error claros.
Zod — una biblioteca moderna y rápida
Zod es una biblioteca para validación declarativa e inferencia de tipos. Está creada específicamente para TypeScript y ofrece una API concisa.
Instalación:
npm install zodEjemplo de uso:
import { z } from 'zod';
// Definimos el esquema de validaciónconst UserSchema = z.object({ name: z.string().min(2, "El nombre debe tener al menos 2 caracteres"), age: z.number().int().positive("La edad debe ser un número positivo"), email: z.string().email("Correo electrónico no válido"),});
// Inferencia del tipo basado en el esquematype User = z.infer<typeof UserSchema>;
// Validación de datosconst result = UserSchema.safeParse({ name: "Ana", age: 25, email: "ana@example.com",});
if (result.success) { // result.data tiene el tipo User console.log(result.data.name);} else { // result.error contiene información detallada sobre los errores console.error(result.error.format());}Zod admite estructuras complejas: objetos anidados, arrays, uniones, uniones discriminadas. También puede transformar datos (por ejemplo, convertir cadenas a números).
Yup — una biblioteca popular del ecosistema React
Yup es una biblioteca para validación de esquemas, ampliamente utilizada junto con Formik en aplicaciones React. Tiene una API similar a Zod, pero apareció antes.
Instalación:
npm install yupEjemplo de uso:
import * as yup from 'yup';
// Definimos el esquemaconst userSchema = yup.object({ name: yup.string().min(2, "El nombre debe tener al menos 2 caracteres").required(), age: yup.number().integer().positive().required(), email: yup.string().email("Correo electrónico no válido").required(),});
// Validación con el método validateuserSchema.validate({ name: "Iván", age: 30, email: "ivan@example.com",}).then(validData => console.log(validData)).catch(err => console.error(err.errors));Yup proporciona métodos convenientes para la validación de formularios, admite mensajes de error personalizados y reglas condicionales (when). Sin embargo, está menos integrado con TypeScript que Zod: la inferencia de tipos requiere acciones adicionales.
io-ts — enfoque funcional para la validación
io-ts es una biblioteca basada en programación funcional. Utiliza el concepto de códecs (codecs) para transformar
También en la biblioteca
Procesamiento de imágenes en C++: bibliotecas CImg, OpenCV y Magick++
Cliente HTTP para Kotlin: Las mejores bibliotecas para trabajar con la red
Métricas de Prometheus en Node.js: biblioteca prom-client para monitoreo
Mongoose Paginate para JavaScript (Node.js): guía completa con ejemplos