Escolar Documentos
Profissional Documentos
Cultura Documentos
Open in app
Eduardo Rabelo
A menos que você seja um veterano experiente de uma linguagem fortemente tipada
como Java, eu tenho certeza que você teve o mesmo momento “WTF?” que eu na
primeira vez que você viu um tipo genérico em TypeScript. A sintaxe está muito longe de
qualquer outra coisa que tenhamos visto em JavaScript e pode ser difícil digerir
imediatamente o que ela está fazendo.
https://oieduardorabelo.medium.com/typescript-entendendo-generics-por-completo-40a372aeea5 1/9
07/02/2021 TypeScript - Entendendo Generics por completo | by Eduardo Rabelo | Medium
Estou aqui para lhe dizer que os tipos genéricos não são tão assustadores quanto
Open in app
parecem. Se você pode escrever uma função com argumentos em JavaScript, então você
poderá escrever e usar o TypeScript Generics como um profissional em pouco tempo.
Vamos começar!
Ótimo! Isso nos dá uma ideia básica. Nós vamos usar o Generics para criar algum tipo de
componente reutilizável que pode funcionar para uma variedade de tipos. Mas como
isso acontece? Aqui está como eu gosto de pensar sobre isso:
Generics são para tipos o que valores são para argumentos de função — eles são
uma maneira de dizer aos nossos componentes (funções, classes ou interfaces) o
tipo que queremos usar quando executarmos esse pedaço de código, da mesma
forma como dizemos a uma função quais valores usar como argumentos quando
nós a executamos.
A melhor maneira de entender o que essa declaração significa é escrever uma função de
identidade genérica. A função identidade é uma função que simplesmente retorna
qualquer argumento que seja passado para ela. Em JavaScript simples, isso seria:
console.log(identity(1)) // 1
https://oieduardorabelo.medium.com/typescript-entendendo-generics-por-completo-40a372aeea5 2/9
07/02/2021 TypeScript - Entendendo Generics por completo | by Eduardo Rabelo | Medium
}
Open in app
console.log(identity(1)) // 1
É bom que tenhamos um tipo definido, mas a função não é muito flexível. A função de
identidade deve funcionar para qualquer valor passado, não apenas números. É aqui que
os genéricos entram. Os genéricos nos permitem escrever uma função que pode assumir
qualquer tipo e transformar nossa função com base nesse tipo.
console.log(identity<Number>(1)) // 1
Existe essa sintaxe <T> desconhecida! Mas não é nada para se ter medo. Assim como se
estivéssemos passando um argumento, passamos o tipo que queremos usar para essa
chamada específica da função.
https://oieduardorabelo.medium.com/typescript-entendendo-generics-por-completo-40a372aeea5 3/9
07/02/2021 TypeScript - Entendendo Generics por completo | by Eduardo Rabelo | Medium
Uma função pode ter vários tipos genéricos, assim como pode ter vários argumentos.
Vale notar como estamos chamando a função. A sintaxe deve começar a fazer sentido
para você agora. Não há nada de especial em T ou U, eles são apenas nomes de
variáveis que escolhemos. Nós os preenchemos com valores de tipo quando
chamamos a função e ela usa esses tipos.
Outra maneira de pensar em genéricos é que eles transformam uma função com base no
tipo de dados que você passa para ela. A animação abaixo mostra como a função de
identidade é alterada com diferentes tipos de dados.
https://oieduardorabelo.medium.com/typescript-entendendo-generics-por-completo-40a372aeea5 4/9
07/02/2021 TypeScript - Entendendo Generics por completo | by Eduardo Rabelo | Medium
Open in app
Um tipo genérico irá se transformar em qualquer tipo que seja passado para ele.
Como você pode ver, a função assume qualquer tipo que seja passada para ela,
permitindo criar componentes reutilizáveis para diferentes tipos, exatamente como a
documentação nos prometeu.
https://oieduardorabelo.medium.com/typescript-entendendo-generics-por-completo-40a372aeea5 5/9
07/02/2021 TypeScript - Entendendo Generics por completo | by Eduardo Rabelo | Medium
Veja se o seguinte bloco de código faz sentido para você agora (espero que sim!):
interface GenericInterface<U> {
value: U
getIdentity: () => U
}
constructor(value: T) {
this.value = value
}
getIdentity () : T {
return this.value
}
Se isso não fizer sentido imediatamente para você, tente rastrear os tipos ( T ) na cadeia
de chamadas de função. Funciona assim:
https://oieduardorabelo.medium.com/typescript-entendendo-generics-por-completo-40a372aeea5 6/9
07/02/2021 TypeScript - Entendendo Generics por completo | by Eduardo Rabelo | Medium
Open in app
Considere o exemplo clássico de herança de um carro. Nós temos uma classe base Car
que é usada como base para Truck e Vespa . Em seguida, escrevemos uma função de
utilidade washCar que recebe uma instância genérica Car e depois a retorna.
class Car {
label: string = 'Generic Car'
numWheels: Number = 4
horn() {
return "beep beep!"
}
}
https://oieduardorabelo.medium.com/typescript-entendendo-generics-por-completo-40a372aeea5 7/9
07/02/2021 TypeScript - Entendendo Generics por completo | by Eduardo Rabelo | Medium
Ao dizer à nossa função washCar que T deve estender Car , sabemos quais funções e
Open in app
propriedades podemos chamar dentro da função. Usar um tipo genérico também nos
permite retornar o tipo específico que passamos, ao invés de apenas um não específico
tipo de Car .
Finalizando
Espero que este post tenha deixado os genéricos mais claros para você! Lembre-se, tudo
o que você está fazendo é passar um valor de tipo para o tipo da função e nada mais. :)
Leitura adicional:
Créditos ⭐
How to Finally Understand Generics in TypeScript, escrito originalmente por Jim
Rottinger
https://oieduardorabelo.medium.com/typescript-entendendo-generics-por-completo-40a372aeea5 8/9
07/02/2021 TypeScript - Entendendo Generics por completo | by Eduardo Rabelo | Medium
https://oieduardorabelo.medium.com/typescript-entendendo-generics-por-completo-40a372aeea5 9/9