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)); // trueTestes
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.