Começando com Valibot
O TypeScript oferece segurança de tipos em tempo de compilação, mas não pode protegê-lo em tempo de execução. Quando dados chegam de um envio de formulário, uma resposta de API ou um arquivo de configuração, os tipos do TypeScript já se foram. Essa é a lacuna que as bibliotecas de validação de schema preenchem — e é exatamente onde o Valibot se destaca.
Este guia apresenta o que é o Valibot, como funciona e como começar a usá-lo para validação de schema TypeScript em projetos frontend reais.
Pontos-Chave
- Valibot é uma biblioteca modular de validação de schema, TypeScript-first, que valida dados em tempo de execução e infere tipos estáticos a partir de seus schemas.
- Sua arquitetura tree-shakeable mantém os tamanhos de bundle mínimos — frequentemente em torno de ~1 KB quando otimizado — tornando-a ideal para aplicações frontend.
- A função
pipepermite pipelines de validação composáveis com mensagens de erro claras e específicas por campo. - Valibot integra-se bem com bibliotecas de formulários populares e suporta saída JSON Schema via pacote complementar para documentação de API.
O Que É Valibot e Por Que Usá-lo?
Valibot é uma biblioteca modular de validação de schema, TypeScript-first. Ela valida dados desconhecidos em tempo de execução e infere tipos TypeScript estáticos a partir de seus schemas, então seu schema se torna a única fonte de verdade tanto para segurança em tempo de execução quanto para tipos em tempo de compilação.
O que a diferencia é sua arquitetura. Em vez de um grande objeto com métodos encadeados (a abordagem que o Zod adota), o Valibot é construído a partir de muitas funções pequenas e independentes. Os bundlers podem fazer tree-shake de tudo que você não usa, o que mantém seu bundle de produção mínimo — frequentemente em torno de ~1 KB dependendo do uso. Essa é uma vantagem significativa em aplicações frontend onde o tamanho do bundle afeta diretamente o tempo de carregamento.
O Valibot é estável, ativamente mantido e está na versão v1+, tornando-o uma escolha sólida para uso em produção.
Definindo Seu Primeiro Schema Valibot
Definir um schema no Valibot se parece com escrever um tipo TypeScript, mas é executado em tempo de execução:
import * as v from 'valibot'
const LoginSchema = v.object({
email: v.string(),
password: v.string(),
})
Você pode então derivar um tipo TypeScript diretamente do schema:
type LoginData = v.InferOutput<typeof LoginSchema>
// { email: string; password: string }
Sem duplicação. Seu schema e seu tipo permanecem sincronizados automaticamente.
Analisando e Validando Dados
O Valibot oferece duas formas principais de validar dados.
parse lança um erro se a validação falhar:
const data = v.parse(LoginSchema, { email: 'jane@example.com', password: '12345678' })
safeParse retorna um objeto de resultado em vez de lançar erro, o que é útil quando você quer lidar com erros sem try/catch:
const result = v.safeParse(LoginSchema, { email: '', password: '' })
if (!result.success) {
console.log(result.issues) // Detalhes estruturados do erro
}
Para validação de formulários, safeParse geralmente é a melhor escolha — mantém o tratamento de erros limpo e previsível.
Discover how at OpenReplay.com.
Pipelines de Validação Composáveis
A função pipe do Valibot permite encadear etapas de validação e transformação. Um pipeline sempre começa com um schema base, seguido por ações que são executadas em sequência:
const EmailSchema = v.pipe(
v.string('Email deve ser uma string.'),
v.nonEmpty('Por favor, insira seu email.'),
v.email('Formato de email inválido.')
)
Cada ação recebe a saída da anterior. Isso torna direto aplicar regras como comprimento mínimo, formatos específicos ou restrições personalizadas — tudo com mensagens de erro claras e específicas por campo que você controla.
Valibot vs Zod: A Diferença Principal
Ambas as bibliotecas resolvem o mesmo problema central. A diferença prática está na filosofia de design e no impacto no bundle.
| Recurso | Valibot | Zod |
|---|---|---|
| Tamanho do bundle | ~1 KB+ (tree-shaken) | ~10–15 KB |
| Tree-shakeable | ✅ Completo | ⚠️ Parcial |
| Estilo de API | Funcional, composável | Encadeamento de métodos |
| Inferência TypeScript | ✅ | ✅ |
Se você já está usando Zod, a migração é direta — os conceitos mapeiam de perto, e a documentação do Valibot inclui orientação para desenvolvedores fazendo a transição.
Ecossistema e Próximos Passos
O Valibot integra-se bem com bibliotecas de formulários populares. A biblioteca Superforms para SvelteKit tem suporte de primeira classe ao Valibot, e existem adaptadores para React Hook Form e outras ferramentas.
Para equipes que precisam de saída JSON Schema — para documentação de API ou especificações OpenAPI — o pacote separado @valibot/to-json-schema cuida disso. Internacionalização para mensagens de erro também é suportada via @valibot/i18n, tornando o Valibot prático para aplicações multilíngues.
Conclusão
O Valibot oferece segurança de tipos em tempo de execução, inferência limpa de TypeScript e uma pegada mínima — sem a sobrecarga de alternativas mais pesadas. Instale-o, defina um schema e deixe sua lógica de validação se tornar a fundação sobre a qual seus tipos são construídos.
npm install valibot
A partir daí, seus schemas podem crescer com sua aplicação — de simples verificações de string a objetos aninhados complexos — sem nunca inflar seu bundle.
Perguntas Frequentes
Sim. O Valibot suporta objetos aninhados usando v.object dentro de outro v.object, e arrays usando v.array. Você pode combinar esses com pipe para adicionar restrições em qualquer nível de profundidade, e o tipo TypeScript inferido refletirá automaticamente toda a estrutura aninhada.
Absolutamente. O Valibot executa em qualquer ambiente JavaScript, então funciona tanto no cliente quanto no servidor. Você pode usá-lo para validar envios de formulários em server actions, manipuladores de rotas de API ou middleware. Seu tamanho pequeno o torna especialmente adequado para runtimes edge com limites estritos de bundle.
Você pode usar a ação v.check dentro de um pipe para definir lógica personalizada. Ela aceita uma função que retorna true ou false, junto com uma mensagem de erro. Para transformações, v.transform permite modificar a saída validada. Ambos se integram perfeitamente em qualquer pipeline de validação.
Não particularmente. Os conceitos centrais como schemas, parsing e inferência de tipos mapeiam de perto entre as duas bibliotecas. A principal mudança é passar do encadeamento de métodos para um estilo funcional com funções independentes. A documentação do Valibot fornece orientação de migração para ajudar a simplificar o processo.
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.