Fácil TypeScript

Função genérica de identidade

Enunciado

Crie uma função genérica identidade que recebe um argumento de qualquer tipo e retorna o mesmo valor. O tipo de retorno deve ser o mesmo do argumento.

Requisitos

  • A função deve se chamar identidade.
  • Deve ser genérica, usando um parâmetro de tipo T.
  • Deve retornar o mesmo tipo que recebeu.
  • Deve funcionar com números, strings e booleanos.

Código inicial

// Complete a função abaixo
function identidade(/* ... */) {
  // ...
}

console.log(identidade(42));
console.log(identidade("texto"));
console.log(identidade(true));

Saída esperada

42
texto
true
Ver dica

Use a sintaxe <T> antes dos parênteses e anote o parâmetro como arg: T e o retorno como : T.

Mostrar solução
// Função genérica que retorna o mesmo valor recebido
function identidade<T>(arg: T): T {
  return arg;
}

console.log(identidade(42));       // T inferido como number
console.log(identidade("texto"));  // T inferido como string
console.log(identidade(true));     // T inferido como boolean

Passo a passo

  1. Declaramos a função identidade com um parâmetro de tipo <T> entre o nome e os parênteses.
  2. O parâmetro arg é anotado como T, indicando que aceita qualquer tipo.
  3. O tipo de retorno também é T, garantindo que o valor retornado tem o mesmo tipo do argumento.
  4. Dentro da função, apenas retornamos arg sem modificações.
  5. Ao chamar identidade(42), o TypeScript infere T como number.
  6. Ao chamar com "texto", infere T como string, e assim por diante.

Por que funciona

O parâmetro de tipo T é uma variável de tipo que será substituída pelo tipo real no momento da chamada. A inferência automática deduz T a partir do argumento passado, então não precisamos escrever identidade<number>(42). Isso mantém a segurança de tipos: o retorno é exatamente do mesmo tipo que a entrada.

Erros comuns

  • Esquecer o <T> na declaração: function identidade(arg: T): T causa erro "Cannot find name 'T'". Corrija adicionando <T> após o nome da função.
  • Usar any em vez de T: function identidade(arg: any): any compila, mas perde a informação de tipo. Evite.
  • Anotar o retorno como any: function identidade<T>(arg: T): any faz o retorno perder o tipo específico. Use : T.

Outra forma de resolver

Você pode usar uma arrow function genérica:

const identidade = <T>(arg: T): T => arg;

É preferível quando você quer uma função de expressão curta.

Saída esperada

42
texto
true