Entender Zod en 2 minutos: Validación de esquemas en TypeScript

¿Buscas una forma simple y eficiente de validar tus datos en TypeScript? Descubre Zod, la biblioteca que revolucionará tu forma de manejar la validación de datos. ¡En solo 2 minutos, entenderás por qué Zod se ha vuelto imprescindible!

¿Por qué Zod? 🎯

Zod es una biblioteca de validación que se destaca por:

  • Una sintaxis intuitiva y concisa
  • Una integración perfecta con TypeScript
  • Una inferencia automática de tipos
  • Mensajes de error claros y personalizables

Instalación rápida ⚙️

bash
1npm install zod
2# o
3yarn add zod

Los fundamentos de Zod en 30 segundos 🚀

typescript
1import { z } from 'zod';
2
3// Definición de un esquema simple
4const userSchema = z.object({
5 nombre: z.string().min(2, 'El nombre debe contener al menos 2 caracteres'),
6 edad: z.number().min(18, 'El usuario debe ser mayor de edad'),
7 email: z.string().email('Formato de email inválido'),
8});
9
10// ¡Tipo inferido automáticamente!
11type User = z.infer<typeof userSchema>;
12
13// Validación de datos
14const validateUser = (data: unknown) => {
15 const result = userSchema.safeParse(data);
16 return result.success ? result.data : result.error.issues;
17};

Características avanzadas 💪

Validación condicional

typescript
1const formularioSchema = z
2 .object({
3 tipo: z.enum(['particular', 'empresa']),
4 cif: z.string().optional(),
5 })
6 .refine((data) => !(data.tipo === 'empresa' && !data.cif), {
7 message: 'El CIF es obligatorio para una empresa',
8 });

Transformaciones automáticas

typescript
1const dateSchema = z.string().transform((str) => new Date(str));
2const numberSchema = z.string().transform(Number);

Buenas prácticas 🎓

  1. Preferir safeParse en lugar de parse para un manejo de errores más elegante:
typescript
1const result = userSchema.safeParse(data);
2if (!result.success) {
3 console.log(result.error.issues);
4 return;
5}
6// Usar result.data de forma segura
  1. Reutilizar los esquemas para una mejor mantenibilidad:
typescript
1const direccionSchema = z.object({
2 calle: z.string(),
3 ciudad: z.string(),
4 codigoPostal: z.string().regex(/^\d{5}$/),
5});
6
7const userSchema = z.object({
8 // ...otros campos
9 direccion: direccionSchema,
10});

Casos de uso comunes 📋

Validación de API

typescript
1const apiResponseSchema = z.object({
2 status: z.number(),
3 data: z.array(userSchema),
4 metadata: z.record(z.string()),
5});
6
7async function fetchUsers() {
8 const response = await fetch('/api/users');
9 const data = await response.json();
10
11 const result = apiResponseSchema.safeParse(data);
12 if (!result.success) {
13 throw new Error('Respuesta API inválida');
14 }
15
16 return result.data;
17}

Validación de formulario

typescript
1const loginSchema = z.object({
2 email: z.string().email(),
3 password: z.string().min(8),
4});
5
6function handleSubmit(formData: unknown) {
7 const result = loginSchema.safeParse(formData);
8 if (!result.success) {
9 // Mostrar errores
10 return;
11 }
12 // Procesar los datos validados
13}

Para ir más allá 🎈

En resumen ✨

Zod simplifica considerablemente la validación de datos en TypeScript mientras garantiza la seguridad de los tipos. Su sintaxis intuitiva y su flexibilidad lo convierten en una herramienta valiosa para cualquier desarrollador TypeScript.


¡No dudes en consultar la documentación oficial para profundizar en tus conocimientos de Zod!

Comparte este artículo


Sébastien Timoner

Sébastien TIMONER

Desarrollador Líder
Experto en Desarrollo a Medida
Aix-en-Provence, France

Experto en desarrollo web y gestión de equipos técnicos, me especializo en la creación y optimización de soluciones digitales de alto rendimiento. Gracias a un profundo dominio de tecnologías modernas como React.js, Node.js, TypeScript y Symfony, garantizo el éxito de proyectos SaaS complejos, desde el diseño hasta la implementación, para empresas de diversos sectores, dentro de offroadLabs.

En offroadLabs, ofrezco servicios de desarrollo a medida, combinando experiencia técnica y enfoque colaborativo. Ya sea para crear una solución SaaS innovadora, modernizar una aplicación existente o acompañar el desarrollo de habilidades de un equipo, me comprometo a proporcionar soluciones robustas y eficientes, adaptadas a las necesidades específicas de cada proyecto.

Estoy disponible para proyectos en la zona de Aix-en-Provence o en modalidad totalmente remota.