Introdução ao class-validator
\n\nclass-validator é uma biblioteca poderosa e popular para validação de dados em TypeScript e JavaScript, construída com base em decoradores. Ela permite descrever declarativamente as regras de validação diretamente dentro das classes, usando anotações. Isso torna o código limpo, legível e fácil de manter.
\n\nA biblioteca é especialmente útil no desenvolvimento de aplicações server-side (por exemplo, em NestJS ou Express), onde é necessário verificar requisições de entrada, dados de formulários, configurações e quaisquer outras estruturas de dados. Em vez de escrever longas cadeias de if-else, você simplesmente adiciona decoradores às propriedades da classe.
\n\nPor que usar class-validator?
\n\n- \n
- Declaratividade: As regras de validação são definidas junto aos dados, melhorando a legibilidade. \n
- Conjunto poderoso de validadores: Inclui dezenas de decoradores embutidos para verificar strings, números, datas, arrays, objetos aninhados e muito mais. \n
- Validadores personalizados: Permite criar facilmente suas próprias regras. \n
- Integração com TypeScript: Suporte total a tipos e decoradores. \n
- Validação assíncrona: Suporta verificações que exigem operações assíncronas (por exemplo, verificação de unicidade no banco de dados). \n
Instalação
\n\nPara usar class-validator, você precisará do Node.js e npm/yarn. Instale a biblioteca e as dependências necessárias:
\n\nnpm install class-validator class-transformer reflect-metadata\n\nOu via yarn:
\n\nyarn add class-validator class-transformer reflect-metadata\n\nImportante: A biblioteca reflect-metadata é obrigatória para o funcionamento dos decoradores. Certifique-se de que ela está importada no seu arquivo principal (por exemplo, index.ts ou main.ts):
import 'reflect-metadata';\n\nAlém disso, certifique-se de que as seguintes configurações estão habilitadas no seu tsconfig.json:
{\n "compilerOptions": {\n "experimentalDecorators": true,\n "emitDecoratorMetadata": true\n }\n}\n\nInício rápido
\n\nVamos criar um modelo de usuário simples e validá-lo.
\n\nimport 'reflect-metadata';\nimport { validate, IsString, IsEmail, MinLength } from 'class-validator';\nimport { plainToClass } from 'class-transformer';\n\nclass User {\n @IsString()\n @MinLength(3, { message: 'O nome deve conter no mínimo 3 caracteres' })\n name: string;\n\n @IsEmail({}, { message: 'Email inválido' })\n email: string;\n\n constructor(name: string, email: string) {\n this.name = name;\n this.email = email;\n }\n}\n\nasync function main() {\n // Criando um objeto com dados inválidos\n const userData = { name: 'Jo', email: 'not-an-email' };\n \n // Convertendo um objeto simples em uma instância da classe\n const user = plainToClass(User, userData);\n \n // Validando\n const errors = await validate(user);\n \n if (errors.length > 0) {\n console.log('Erros de validação:', errors);\n errors.forEach(error => {\n console.log(`Campo: ${error.property}`);\n for (const constraint in error.constraints) {\n console.log(` - ${error.constraints[constraint]}`);\n }\n });\n } else {\n console.log('Validação bem-sucedida!');\n }\n}\n\nmain();\n// Saída:\n// Erros de validação: [...]\n// Campo: name\n// - O nome deve conter no mínimo 3 caracteres\n// Campo: email\n// - Email inválido\n\nPrincipais métodos e decoradores
\n\n1. @IsString()
\nO que faz: Verifica se o valor é uma string.
\nParâmetros: Aceita um objeto opcional com opções de validação (por exemplo, { message: '...' }).