React

Como Validar Formulários com Yup e TypeScript de Forma Robusta

A criação de formulários em aplicações web exige não apenas uma interface amigável, mas também validações sólidas para garantir dados precisos e seguros. Neste artigo, vamos aprender a como validar formulários com yup e typescript de forma robusta, para não causar erros futuros, utilizando uma abordagem avançada. Esta combinação proporciona uma experiência de desenvolvimento mais confiável e uma detecção de erros antecipada.

Validação de Formulário com Yup e TypeScript.
Representação de como validar formulários com Yup e TypeScript.

Acesse também: Validação de Formulários com JavaScript

Instalando as Dependências:

Antes de começarmos, precisamos instalar o Yup e o TypeScript. Abra o terminal na raiz do seu projeto e execute os seguintes comandos:

npm install yup
npm install --save-dev typescript @types/node @types/yup

Certifique-se de que seu projeto já possui um arquivo tsconfig.json. Se não tiver, você pode inicializar um projeto TypeScript com:

npx tsc --init

Criando um Esquema de Validação com Yup:

O Yup permite que você defina esquemas de validação de forma declarativa. Vamos criar um esquema de validação para um formulário de registro simples com nome, email e senha:

// dentro da pasta src/schemas/RegistroSchema.ts
import * as yup from 'yup';

const RegistroSchema = yup.object({
  nome: yup.string().required('O nome é obrigatório'),
  email: yup.string().email('Insira um email válido').required('O email é obrigatório'),
  senha: yup.string().min(6, 'A senha deve ter no mínimo 6 caracteres').required('A senha é obrigatória'),
});

export default RegistroSchema;

Neste exemplo, definimos um esquema utilizando yup.object, especificando as regras para cada campo (nome, email e senha). O método required indica que o campo é obrigatório, e min estabelece um comprimento mínimo para a senha. Mensagens personalizadas de erro são fornecidas para cada regra.

Integrando Yup com TypeScript:

Agora, vamos criar uma função que utiliza este esquema de validação em nosso código TypeScript:

// dentro da pasta src/utils/validacao.ts
import { ObjectSchema } from 'yup';

type YupValidationError = {
  path: string;
  message: string;
};

async function validarDados<T>(schema: ObjectSchema<T>, dados: T): Promise<YupValidationError[]> {
  try {
    await schema.validate(dados, { abortEarly: false });
    return [];
  } catch (erro) {
    if (erro instanceof yup.ValidationError) {
      return erro.inner.map((err) => ({ path: err.path as string, message: err.message }));
    }
    throw erro;
  }
}

export default validarDados;

A função validarDados recebe um esquema Yup e os dados a serem validados. Se a validação for bem-sucedida, retorna uma array vazia. Se houver erros, retorna uma array de objetos contendo o caminho do erro e a mensagem correspondente.

Utilizando a Validação em um Componente React:

Vamos agora aplicar nossa validação em um componente React usando TypeScript:

// src/components/FormularioRegistro.tsx
import React, { useState } from 'react';
import RegistroSchema from '../schemas/RegistroSchema';
import validarDados from '../utils/validacao';

const FormularioRegistro: React.FC = () => {
  const [dados, setDados] = useState({ nome: '', email: '', senha: '' });
  const [erros, setErros] = useState<YupValidationError[]>([]);

  const handleChange = (campo: string, valor: string) => {
    setDados((prevDados) => ({ ...prevDados, [campo]: valor }));
  };

  const handleSubmit = async (event: React.FormEvent) => {
    event.preventDefault();
    const errosValidacao = await validarDados(RegistroSchema, dados);
    setErros(errosValidacao);

    if (errosValidacao.length === 0) {
      // Lógica de envio do formulário aqui
      console.log('Formulário enviado com sucesso!', dados);
    }
  };

  return (
    <form onSubmit={handleSubmit}>
      <div>
        <label htmlFor="nome">Nome:</label>
        <input
          type="text"
          id="nome"
          name="nome"
          value={dados.nome}
          onChange={(e) => handleChange('nome', e.target.value)}
        />
        {erros.find((erro) => erro.path === 'nome') && <span>{erros.find((erro) => erro.path === 'nome')?.message}</span>}
      </div>

      <div>
        <label htmlFor="email">Email:</label>
        <input
          type="email"
          id="email"
          name="email"
          value={dados.email}
          onChange={(e) => handleChange('email', e.target.value)}
        />
        {erros.find((erro) => erro.path === 'email') && <span>{erros.find((erro) => erro.path === 'email')?.message}</span>}
      </div>

      <div>
        <label htmlFor="senha">Senha:</label>
        <input
          type="password"
          id="senha"
          name="senha"
          value={dados.senha}
          onChange={(e) => handleChange('senha', e.target.value)}
        />
        {erros.find((erro) => erro.path === 'senha') && <span>{erros.find((erro) => erro.path === 'senha')?.message}</span>}
      </div>

      <button type="submit">Registrar</button>
    </form>
  );
};

export default FormularioRegistro;

Este componente React FormularioRegistro utiliza o esquema Yup para validar os dados do formulário. A função validarDados é chamada no evento de envio (onSubmit), e os erros são exibidos dinamicamente abaixo de cada campo correspondente.

Elevando a Qualidade da Validação com Yup e TypeScript

A combinação do Yup com TypeScript oferece uma abordagem robusta e tipada para a validação de formulários. Ao criar esquemas de validação claros e integrá-los com a lógica de manipulação de erros em componentes React, você aumenta a confiabilidade de suas aplicações e melhora a experiência do usuário. A utilização de TypeScript proporciona uma detecção de erros mais precoce, reduzindo bugs relacionados a tipos e garantindo que seu código seja mais seguro e fácil de dar manutenção. Experimente incorporar essas práticas em seus projetos e eleve a qualidade de suas validações de formulários a um novo patamar.

Deixe uma reação

Engraçado
0
Feliz
0
Amei
0
Interessante
0

You may also like

1 Comment

Leave a reply

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *