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
nullouundefined
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 zodExemplo 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 yupExemplo 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()etransform()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< Também na biblioteca
goose para Go: guia completo com exemplos práticos
Migrações de banco de dados em Node.js: Sequelize, Knex e TypeORM
GraphQL para Kotlin: bibliotecas poderosas para criar APIs
Trabalho com imagens em PHP: redimensionamento e corte (resize, crop)