Back

Começando com Valibot

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 pipe permite 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.

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.

RecursoValibotZod
Tamanho do bundle~1 KB+ (tree-shaken)~10–15 KB
Tree-shakeable✅ Completo⚠️ Parcial
Estilo de APIFuncional, composávelEncadeamento 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.

OpenReplay