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
- Declaramos a função
identidadecom um parâmetro de tipo<T>entre o nome e os parênteses. - O parâmetro
argé anotado comoT, indicando que aceita qualquer tipo. - O tipo de retorno também é
T, garantindo que o valor retornado tem o mesmo tipo do argumento. - Dentro da função, apenas retornamos
argsem modificações. - Ao chamar
identidade(42), o TypeScript infereTcomonumber. - Ao chamar com
"texto", infereTcomostring, 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): Tcausa erro "Cannot find name 'T'". Corrija adicionando<T>após o nome da função. - Usar
anyem vez deT:function identidade(arg: any): anycompila, mas perde a informação de tipo. Evite. - Anotar o retorno como
any:function identidade<T>(arg: T): anyfaz 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