O Gerador De CPF O Gerador De CPF

Gerar CPF em TypeScript: Função com Testes Vitest

Se você já usou nosso gerador de CPF válido para testes manuais, esta função TypeScript traz a mesma lógica para dentro do seu projeto com tipagem completa. Retorno string, zero dependências, pronta para integrar em suítes de teste que exigem segurança de tipos.

Código

function generateCPF(): string {
  const digits: number[] = [];
  for (let i = 0; i < 9; i++) {
    digits.push(Math.floor(Math.random() * 10));
  }

  let sum1 = 0;
  for (let j = 0; j < 9; j++) {
    sum1 += digits[j] * (10 - j);
  }
  const r1: number = sum1 % 11;
  const d1: number = r1 < 2 ? 0 : 11 - r1;
  digits.push(d1);

  let sum2 = 0;
  for (let k = 0; k < 10; k++) {
    sum2 += digits[k] * (11 - k);
  }
  const r2: number = sum2 % 11;
  const d2: number = r2 < 2 ? 0 : 11 - r2;
  digits.push(d2);

  return digits.join('');
}

function validateCPF(cpf: string): boolean {
  const clean: string = cpf.replace(/[^\d]/g, '');
  if (clean.length !== 11) return false;

  for (let i = 0; i < 10; i++) {
    if (clean === String(i).repeat(11)) return false;
  }

  let sum1 = 0;
  for (let j = 0; j < 9; j++) {
    sum1 += parseInt(clean.charAt(j), 10) * (10 - j);
  }
  const r1: number = sum1 % 11;
  const d1: number = r1 < 2 ? 0 : 11 - r1;
  if (parseInt(clean.charAt(9), 10) !== d1) return false;

  let sum2 = 0;
  for (let k = 0; k < 10; k++) {
    sum2 += parseInt(clean.charAt(k), 10) * (11 - k);
  }
  const r2: number = sum2 % 11;
  const d2: number = r2 < 2 ? 0 : 11 - r2;
  return parseInt(clean.charAt(10), 10) === d2;
}

Análise do código

generateCPF retorna string para preservar zeros à esquerda, que seriam perdidos com number. Cria 9 dígitos aleatórios, calcula o primeiro verificador com pesos de 10 a 2 e módulo 11, depois o segundo com pesos de 11 a 2.

validateCPF aceita string como entrada, limpa caracteres não numéricos, rejeita sequências de dígitos repetidos com String(i).repeat(11) e recalcula ambos os verificadores. Está incluída como função auxiliar para os testes.

A tipagem explícita em digits: number[], r1: number e no retorno : string garante que erros de tipo sejam capturados em tempo de compilação.

Uso

const cpf: string = generateCPF();
console.log(cpf);              // "83456729104" (exemplo)
console.log(validateCPF(cpf)); // true

Testes

Testes com Vitest:

import { describe, it, expect } from 'vitest';

describe('generateCPF', () => {
  it('retorna string com 11 dígitos numéricos', () => {
    const cpf: string = generateCPF();
    expect(cpf).toMatch(/^\d{11}$/);
  });

  it('gera CPF que passa na validação', () => {
    const cpf: string = generateCPF();
    expect(validateCPF(cpf)).toBe(true);
  });

  it('gera CPFs diferentes entre si', () => {
    const cpfs = new Set<string>();
    for (let i = 0; i < 50; i++) {
      cpfs.add(generateCPF());
    }
    expect(cpfs.size).toBeGreaterThan(1);
  });
});

Veja também: validar CPF em TypeScript e o gerador de CPF online.