Skip to main content

Currying e runtime bounding

  • Currying e runtime bounding

Currying

function soma(a: number, b: number){
return a + b
}
function currySimple(func: (...args: any) => any){
return function curried(...args: unknown[]){
if(args.length >= func.length){
return func(...args)
}
return function partial(...args2: unknown[]){
return curried(...args, ...args2)
}
}
}

const partialSum = currySimple(simpleSum)
const partialSum1 = partialSum(1)
const partialSum2 = partialSum(2)


const totalSum = partialSum(1)(2) //partialSum(1,2)
  • A verificação em tempo de execução dentro da função currySimple garante que a função original só seja chamada quando o número correto de argumentos tiver sido fornecido. Caso contrário, ela retorna uma nova função que espera os próximos argumentos.

Exemplo prático

const enviarEmail = (assunto: string) => (corpo: string) => (destinatario: string) => {
console.log(`Enviando email para ${destinatario} com assunto "${assunto}" e corpo "${corpo}"`);
};

const enviarEmailDeBoasVindas = enviarEmail('Bem-vindo');
const enviarEmailDeBoasVindasComCorpo = enviarEmailDeBoasVindas('Obrigado por se inscrever!');

enviarEmailDeBoasVindasComCorpo('usuario@exemplo.com'); // Enviando email para usuario@exemplo.com com assunto "Bem-vindo" e corpo "Obrigado por se inscrever!"

Runtime bounding

interface Ops<TipoInicial>{
array: TipoInicial[]
prefix: <Prefixo>(item: TipoInicial, prefix: Prefixo) => string

}

const ops: Ops<string> = {}

const ops2:Ops<string> = {
array: ['1'],
prefix: (item, prefix) => {
return `${item}${prefix}`
}
}

ops2.prefix<'a'>('1', 'a') //1a