Validação de dados em TypeScript: visão geral das bibliotecas Zod, Yup e io-ts
TypeScript é uma linguagem estaticamente tipada que verifica tipos em tempo de compilação. No entanto, em tempo de execução (runtime), o TypeScript não realiza nenhuma verificação. Isso significa que os dados obtidos de fontes externas — requisições de API, formulários de entrada, arquivos de configuração — podem não corresponder aos tipos esperados. Para resolver esse problema, são utilizadas bibliotecas de validação de dados, que verificam a estrutura e os tipos de dados em tempo de execução.
Neste artigo, veremos três bibliotecas populares para validação de dados em TypeScript: Zod, Yup e io-ts. Você aprenderá como elas funcionam, quais são suas diferenças e como escolher a mais adequada para o seu projeto.
Por que a validação de dados é necessária em TypeScript?
Imagine que você está escrevendo um aplicativo que recebe dados do usuário através de um formulário:
interface UserInput { name: string; age: number; email: string;}
function processUserInput(input: UserInput) { console.log(input.name.toUpperCase());}Em TypeScript, esse código será compilado, mesmo que em tempo de execução input.name seja undefined ou um número. Isso resultará em um erro difícil de detectar. As bibliotecas de validação permitem garantir que os dados correspondam ao esquema esperado e fornecem mensagens de erro claras.
Zod — biblioteca moderna e rápida
Zod é uma biblioteca para validação declarativa e inferência de tipos. Ela foi criada especificamente para TypeScript e oferece uma API concisa.
Instalação:
npm install zodExemplo de uso:
import { z } from 'zod';
// Define o esquema de validaçãoconst UserSchema = z.object({ name: z.string().min(2, "O nome deve ter no mínimo 2 caracteres"), age: z.number().int().positive("A idade deve ser um número positivo"), email: z.string().email("Email inválido"),});
// Inferência do tipo baseado no esquematype User = z.infer<typeof UserSchema>;
// Validação dos dadosconst result = UserSchema.safeParse({ name: "Ana", age: 25, email: "ana@example.com",});
if (result.success) { // result.data tem o tipo User console.log(result.data.name);} else { // result.error contém informações detalhadas sobre os erros console.error(result.error.format());}Zod suporta estruturas complexas: objetos aninhados, arrays, uniões, discriminated unions. Ele também pode transformar dados (por exemplo, converter strings em números).
Yup — biblioteca popular do ecossistema React
Yup é uma biblioteca para validação de esquemas, amplamente utilizada com Formik em aplicações React. Ela possui uma API semelhante à do Zod, mas surgiu antes.
Instalação:
npm install yupExemplo de uso:
import * as yup from 'yup';
// Define o esquemaconst userSchema = yup.object({ name: yup.string().min(2, "O nome deve ter no mínimo 2 caracteres").required(), age: yup.number().integer().positive().required(), email: yup.string().email("Email inválido").required(),});
// Validação usando o método validateuserSchema.validate({ name: "João", age: 30, email: "joao@example.com",}).then(validData => console.log(validData)).catch(err => console.error(err.errors));Yup fornece métodos convenientes para validação de formulários, suporta mensagens de erro personalizadas e regras condicionais (when). No entanto, ele é menos integrado com TypeScript do que o Zod — a inferência de tipos requer etapas adicionais.
io-ts — abordagem funcional para validação
io-ts é uma biblioteca baseada em programação funcional. Ela utiliza o conceito de codecs para transformar