Validação de dados em TypeScript: Zod, Yup e outras ferramentas

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Validação de dados em TypeScript: visão geral de ferramentas e práticas



No desenvolvimento web moderno com TypeScript, uma das tarefas principais é garantir a integridade dos dados. Mesmo com a tipagem estática rigorosa do TypeScript, ele não pode garantir que os dados vindos do mundo externo (API, formulários, localStorage) correspondam ao formato esperado. É aqui que entra a validação em tempo de execução — a verificação dos dados durante a execução do programa. Neste artigo, veremos três bibliotecas populares: Zod, Yup e Joi, compararemos suas abordagens e mostraremos como integrar a validação em um projeto TypeScript.



Por que tipos simples do TypeScript não são suficientes?

O TypeScript verifica os tipos em tempo de compilação, mas em tempo de execução todas as anotações são apagadas. Isso significa que:

  • Os dados do usuário podem conter campos extras ou faltar campos obrigatórios
  • Números podem vir como strings
  • Objetos podem ser null ou undefined

As bibliotecas de validação resolvem esse problema fornecendo esquemas que funcionam tanto como verificação quanto como inferência de tipos.



1. Zod — o padrão moderno

Zod é a biblioteca mais popular para validação em TypeScript. Sua principal vantagem é a inferência automática de tipos TypeScript a partir dos esquemas.



Instalação

npm install zod


Exemplo de esquema básico

import { z } from 'zod';

const UserSchema = z.object({ id: z.number().positive(), name: z.string().min(2).max(50), email: z.string().email(), age: z.number().int().min(18).optional(),});

// Inferência de tipo: { id: number; name: string; email: string; age?: number }type User = z.infer<typeof UserSchema>;

// Validaçãoconst result = UserSchema.safeParse(inputData);if (!result.success) { console.error(result.error.errors);} else { // result.data — dados válidos com o tipo User processUser(result.data);}


Funcionalidades avançadas

  • Transformação: z.string().transform(val => val.trim())
  • Uniões discriminadas: z.discriminatedUnion('type', [...])
  • Esquemas recursivos: z.lazy(() => NodeSchema)
  • Erros personalizados: z.string().refine(val => !val.includes('bad'), 'Não é permitido usar a palavra bad')


2. Yup — ferramenta testada pelo tempo

Yup é uma biblioteca com uma rica história, originalmente criada para validação de formulários. Ela se integra perfeitamente com Formik e React Hook Form.



Instalação

npm install yup


Exemplo de esquema

import * as yup from 'yup';

const productSchema = yup.object({ title: yup.string().required('Título é obrigatório').min(3), price: yup.number().positive('O preço deve ser positivo').required(), inStock: yup.boolean().default(true),});

type Product = yup.InferType<typeof productSchema>;

// ValidaçãoproductSchema.validate(inputData, { abortEarly: false }) .then(validData => console.log(validData)) .catch(err => console.error(err.errors));


Características do Yup

  • Suporte a validação condicional: .when('field', ...)
  • Mensagens de erro embutidas em português (com configuração de localidade)
  • Trabalho simples com objetos aninhados e arrays
  • Métodos cast() e transform() para conversão de tipos


3. Joi — poderoso, mas mais pesado

Joi é uma biblioteca lendária do ecossistema Node.js (Hapi.js). Ela oferece máxima flexibilidade, mas não possui integração embutida com TypeScript (requer definição manual de tipos).



Instalação

npm install joi @types/joi<                    

Recommendations