Back

Primeros Pasos con Valibot

Primeros Pasos con Valibot

TypeScript te brinda seguridad de tipos en tiempo de compilación, pero no puede protegerte en tiempo de ejecución. Cuando los datos llegan desde el envío de un formulario, una respuesta de API o un archivo de configuración, los tipos de TypeScript ya han desaparecido. Ese es el vacío que llenan las bibliotecas de validación de esquemas, y es exactamente donde Valibot destaca.

Esta guía te explica qué es Valibot, cómo funciona y cómo empezar a usarlo para la validación de esquemas TypeScript en proyectos frontend reales.

Puntos Clave

  • Valibot es una biblioteca modular de validación de esquemas centrada en TypeScript que valida datos en tiempo de ejecución e infiere tipos estáticos a partir de tus esquemas.
  • Su arquitectura tree-shakeable mantiene los tamaños de bundle mínimos — a menudo alrededor de ~1 KB cuando se aplica tree-shaking — lo que la hace ideal para aplicaciones frontend.
  • La función pipe permite pipelines de validación componibles con mensajes de error claros a nivel de campo.
  • Valibot se integra bien con bibliotecas de formularios populares y admite salida de JSON Schema a través de un paquete complementario para documentación de API.

¿Qué Es Valibot y Por Qué Usarlo?

Valibot es una biblioteca modular de validación de esquemas centrada en TypeScript. Valida datos desconocidos en tiempo de ejecución e infiere tipos estáticos de TypeScript a partir de tus esquemas, por lo que tu esquema se convierte en la única fuente de verdad tanto para la seguridad en tiempo de ejecución como para los tipos en tiempo de compilación.

Lo que la hace destacar es su arquitectura. En lugar de un objeto grande con métodos encadenados (el enfoque que toma Zod), Valibot está construida a partir de muchas funciones pequeñas e independientes. Los bundlers pueden aplicar tree-shaking a todo lo que no uses, lo que mantiene tu bundle de producción mínimo — a menudo alrededor de ~1 KB dependiendo del uso. Esa es una ventaja significativa en aplicaciones frontend donde el tamaño del bundle afecta directamente el tiempo de carga.

Valibot es estable, se mantiene activamente y está en v1+, lo que la convierte en una opción sólida para uso en producción.

Definiendo Tu Primer Esquema Valibot

Definir un esquema en Valibot se parece a escribir un tipo TypeScript, pero se ejecuta en tiempo de ejecución:

import * as v from 'valibot'

const LoginSchema = v.object({
  email: v.string(),
  password: v.string(),
})

Luego puedes derivar un tipo TypeScript directamente del esquema:

type LoginData = v.InferOutput<typeof LoginSchema>
// { email: string; password: string }

Sin duplicación. Tu esquema y tu tipo permanecen sincronizados automáticamente.

Parseando y Validando Datos

Valibot te ofrece dos formas principales de validar datos.

parse lanza un error si la validación falla:

const data = v.parse(LoginSchema, { email: 'jane@example.com', password: '12345678' })

safeParse devuelve un objeto de resultado en lugar de lanzar un error, lo cual es útil cuando quieres manejar errores sin try/catch:

const result = v.safeParse(LoginSchema, { email: '', password: '' })

if (!result.success) {
  console.log(result.issues) // Detalles de error estructurados
}

Para validación de formularios, safeParse suele ser la mejor opción — mantiene el manejo de errores limpio y predecible.

Pipelines de Validación Componibles

La función pipe de Valibot te permite encadenar pasos de validación y transformación. Un pipeline siempre comienza con un esquema base, seguido de acciones que se ejecutan en secuencia:

const EmailSchema = v.pipe(
  v.string('Email must be a string.'),
  v.nonEmpty('Please enter your email.'),
  v.email('Invalid email format.')
)

Cada acción recibe la salida de la anterior. Esto hace que sea sencillo aplicar reglas como longitud mínima, formatos específicos o restricciones personalizadas — todo con mensajes de error claros a nivel de campo que tú controlas.

Valibot vs Zod: La Diferencia Clave

Ambas bibliotecas resuelven el mismo problema central. La diferencia práctica está en la filosofía de diseño y el impacto en el bundle.

CaracterísticaValibotZod
Tamaño del bundle~1 KB+ (tree-shaken)~10–15 KB
Tree-shakeable✅ Completo⚠️ Parcial
Estilo de APIFuncional, componibleEncadenamiento de métodos
Inferencia TypeScript

Si ya estás usando Zod, la migración es sencilla — los conceptos se mapean estrechamente, y la documentación de Valibot incluye orientación para desarrolladores que hacen el cambio.

Ecosistema y Qué Viene Después

Valibot se integra bien con bibliotecas de formularios populares. La biblioteca Superforms para SvelteKit tiene soporte de primera clase para Valibot, y existen adaptadores para React Hook Form y otras herramientas.

Para equipos que necesitan salida de JSON Schema — para documentación de API o especificaciones OpenAPI — el paquete separado @valibot/to-json-schema se encarga de eso. La internacionalización para mensajes de error también es compatible a través de @valibot/i18n, lo que hace que Valibot sea práctico para aplicaciones multilingües.

Conclusión

Valibot te brinda seguridad de tipos en tiempo de ejecución, inferencia limpia de TypeScript y una huella mínima — sin la sobrecarga de alternativas más pesadas. Instálalo, define un esquema y deja que tu lógica de validación se convierta en la base sobre la que se construyen tus tipos.

npm install valibot

A partir de ahí, tus esquemas pueden crecer con tu aplicación — desde simples verificaciones de cadenas hasta objetos anidados complejos — sin inflar nunca tu bundle.

Preguntas Frecuentes

Sí. Valibot admite objetos anidados usando v.object dentro de otro v.object, y arrays usando v.array. Puedes combinarlos con pipe para agregar restricciones en cualquier nivel de profundidad, y el tipo TypeScript inferido reflejará automáticamente la estructura anidada completa.

Absolutamente. Valibot se ejecuta en cualquier entorno JavaScript, por lo que funciona tanto en el cliente como en el servidor. Puedes usarlo para validar envíos de formularios en server actions, manejadores de rutas de API o middleware. Su pequeño tamaño lo hace especialmente adecuado para runtimes edge con límites estrictos de bundle.

Puedes usar la acción v.check dentro de un pipe para definir lógica personalizada. Acepta una función que devuelve true o false, junto con un mensaje de error. Para transformaciones, v.transform te permite modificar la salida validada. Ambos se integran perfectamente en cualquier pipeline de validación.

No particularmente. Los conceptos centrales como esquemas, parsing e inferencia de tipos se mapean estrechamente entre las dos bibliotecas. El cambio principal es pasar del encadenamiento de métodos a un estilo funcional con funciones independientes. La documentación de Valibot proporciona orientación de migración para ayudar a agilizar el proceso.

Complete picture for complete understanding

Capture every clue your frontend is leaving so you can instantly get to the root cause of any issue with OpenReplay — the open-source session replay tool for developers. Self-host it in minutes, and have complete control over your customer data.

Check our GitHub repo and join the thousands of developers in our community.

OpenReplay