Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Quando trabalhamos com validação de formulários que exigem um número de telefone com comprimento exato, a implementação pode se complicar dependendo do tipo de dado que utilizamos. Muitas vezes, a validação padrão com Yup usando números não consegue garantir que o input tenha exatamente 8 caracteres, especialmente porque o método min() verifica apenas valores numéricos e não a quantidade de dígitos.
O desafio é assegurar que o campo de telefone aceite apenas números com exatamente 8 dígitos, como '10000000', sem permitir valores menores ou maiores, ou entradas inválidas como '1234567' ou '123456789'. O método min() do Yup, quando usado com números, verifica o valor numérico mínimo, não o tamanho do dado. Assim, inserir '8' passa na validação, mas não garante que o número seja realmente de 8 dígitos. A decisão fica mais saudável quando o time consegue medir o impacto depois.
O erro comum é tentar usar Yup.number().min(8), esperando que o campo aceite exatamente 8 dígitos. Porém, essa validação permite qualquer número maior ou igual a 8, incluindo '9', '10', '100000000', e assim por diante. Outra questão é que, ao usar number(), o Yup interpreta o valor como numérico, eliminando zeros à esquerda, o que pode gerar problemas se o usuário inserir '00001234'. Sem esse critério, a solução pode parecer simples no começo e cara no suporte. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta.
A melhor estratégia aqui é tratar o campo como uma string, e não um número. Dessa forma, podemos aplicar uma validação de comprimento exato através de regex, que garante que o valor tenha exatamente 8 dígitos numéricos.
Para isso, podemos usar Yup.string().matches() com uma expressão regular que valida exatamente 8 dígitos:
const phoneRegExp = /^\d{8}$/. Yup.string()
.matches(phoneRegExp, 'Telefone deve conter exatamente 8 dígitos')
.required('Telefone é obrigatório')
Essa abordagem garante que o valor seja uma string composta apenas por dígitos e com comprimento exato de 8 caracteres. A decisão fica mais saudável quando o time consegue medir o impacto depois. Sem esse critério, a solução pode parecer simples no começo e cara no suporte. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco.
1. Alterar o campo de validação para usar Yup.string() ao invés de Yup.number().
2. Aplicar uma regex que valida exatamente 8 dígitos.
3. Validar na interface de usuário para garantir que o usuário saiba que deve inserir exatamente 8 dígitos.
4. Para casos mais complexos, considere usar uma validação personalizada que também verifica o formato de entrada.
const schema = Yup.object({
telefone: Yup.string()
.matches(/^\d{8}$/, 'Telefone deve conter exatamente 8 dígitos')
.required('Telefone é obrigatório')
}). // Teste
schema.validate({ telefone: '10000000' }) // passa
schema.validate({ telefone: '1234567' }) // falha
schema.validate({ telefone: '123456789' }) // falha
schema.validate({ telefone: '12a45678' }) // falha Sem esse critério, a solução pode parecer simples no começo e cara no suporte.
Ao trabalhar com validação de comprimento fixo, tratar o dado como string e usar regex é a abordagem mais segura e direta. Assim, evitamos ambiguidades de validação numérica e garantimos que o input do usuário seja exatamente o esperado, sem surpresas na validação ou na manipulação dos dados. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar. A decisão fica mais saudável quando o time consegue medir o impacto depois. Sem esse critério, a solução pode parecer simples no começo e cara no suporte.
Para cenários de produção, é importante também pensar na experiência do usuário, deixando claro na interface que o campo exige exatamente 8 dígitos, evitando frustrações na hora de submissão. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco.
Concordo, o ponto é que usar number() limita demais e não garante o tamanho exato. O regex resolve bonito esse problema.
Boa dica, essa abordagem de tratar como string é bem mais segura. Já passei por isso de validação numérica e confundiu muita gente quando tinha zeros à esquerda.
Só cuidado com entradas que tenham espaços ou caracteres especiais, aí tem que ajustar a regex pra aceitar esses formatos, se necessário.