Skip to content

Instantly share code, notes, and snippets.

@joaohcrangel
Last active June 25, 2024 15:16
Show Gist options
  • Save joaohcrangel/8bd48bcc40b9db63bef7201143303937 to your computer and use it in GitHub Desktop.
Save joaohcrangel/8bd48bcc40b9db63bef7201143303937 to your computer and use it in GitHub Desktop.
Função para validar CPF em TypeScript
function isValidCPF(value: string) {
if (typeof value !== 'string') {
return false;
}
value = value.replace(/[^\d]+/g, '');
if (value.length !== 11 || !!value.match(/(\d)\1{10}/)) {
return false;
}
const values = value.split('').map(el => +el);
const rest = (count) => (values.slice(0, count-12).reduce( (soma, el, index) => (soma + el * (count-index)), 0 )*10) % 11 % 10;
return rest(10) === values[9] && rest(11) === values[10];
}
@seujorgenochurras
Copy link

Mano, essa galera do JS tem problema, nao é possível... O cara posta uma função para validar CPF em TYPESCRIPT aí os maluco vem um querendo ser um "melhor" que o outro e começam a dar variações de funções do nada, com problema de lógica, sem typescript, focando em fazer um código todo esmagado, quase impossível de ler e dar manutenção, usando framework que ele tirou da cabeça e ninguém pediu... Teve até maluco com função PHP nessa loucura... Gente, qual o problema de vocês?

Se for comentar, comente algo útil! Comente algo que MELHORE a função do cara REFATORANDO a versão dele. Não faz sentido nenhum postar OUTRA completamente diferente... Para isso, crie seu próprio gist...

Cada uma... Já fiquei irritado aqui, ta louco...

Entrei aqui pra pegar a função do cara, um monte de gente comentou, mas no final das contas vou ter que pegar a original do cara pq é a única descente aqui usando Typescript, ou seja, um monte de comentário inútil.... 🤦 (não que esse meu aqui não seja também inútil)

Não vejo problema nenhum nas pessoas querem melhor um código existente. Isso é uma das qualidades mais importantes de um bom programador. Eu até prefiro que um código que estou prestes a roubar tenha sido validado e melhorado por vários programadores.

Meu problema é que da pra "sentir" em alguns textos que tem gente querendo puxar ego sem ter feito grande coisa, esse tipo de pessoa vai atrapalhar dms o leitor, fazendo ele perder tempo pra krl lendo o quão foda e dificil é seja la a merda que ela fez.

Não me entendam mal, eu iria gostar se algum maluco tivesse postado um validador de cep extremamente eficiente aqui, mostrando o quão melhor o código dele é (usando benchmarks), mas nesse ponto é melhor fazer uma rinha de validador de CPF.

Com isso dito, os posts desse gist estão bem amigaveis. Se vc achou os comentarios desse gist ruins, acho melhor passar longe do stackOverflow pra copiar código.

btw vc não precisava ler os comentários, o cara que postou esse gist fez várias revisões de acordo com a galera do chat.

@marcobraghim
Copy link

Você está certíssimo! haha

@jaronwanderley
Copy link

jaronwanderley commented Dec 11, 2023

não queria comentar, mas hoje eu tô no humor pra falar, se não gostou faz do seu seu jeito.

Você como programador deveria saber o que é melhor pra sua aplicação (se não tem essa capacidade, seja humilde e pergunte o porque das coisas)... ter alternativas não prejudica em nada a comunidade

Tem gente que parece que quer biscoito 🍪

@bestknighter
Copy link

Precisei dessa função novamente em outro projeto. Só que nele eu tbm precisava da função que gerava o dígito verificador em outros lugares do código. Lá eu transformei ela num método funcional puro e extraí para o mesmo módulo. Apliquei a mesma mudança aqui mas mantive dentro da função para não poluir o escopo.

function isValidCPF(value: string) {
    // Se não for string, o CPF é inválido
    if (typeof value !== 'string') {
        return false;
    }

    // Remove todos os caracteres que não sejam números
    value = value.replace(/[^\d]+/g, '');

    // Se o CPF não tem 11 dígitos ou todos os dígitos são repetidos, o CPF é inválido
    if (value.length !== 11 || !!value.match(/(\d)\1{10}/)) {
        return false;
    }
    
    // Transforma de string para number[] com cada dígito sendo um número no array
    const digits = value.split('').map(el => +el);

    // Função que calcula o dígito verificador de acordo com a fórmula da Receita Federal
    function getVerifyingDigit(arr: number[]) {
        const reduced = arr.reduce( (sum, digit, index)=>(sum + digit * (arr.length - index + 1)), 0 );
        return (reduced * 10) % 11 % 10;
    }

    // O CPF é válido se, e somente se, os dígitos verificadores estão corretos
    return getVerifyingDigit(digits.slice(0, 9)) === digits[9]
        && getVerifyingDigit(digits.slice(0, 10)) === digits[10];
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment