TypeScript - Generics básico
- #TypeScript
Em seus estudos de TypeScript talvez você tenha visto o termo "Generics", e caso você seja iniciante em programação ou ainda não tenha conhecimento em Programação Orientada a Objetos, como Java e C#, tenha se perguntado: O que é Generics?
Definição de Generics
Segundo a da documentação oficial do TypeScript, Generics é definido como:
"...um componente que pode funcionar sobre uma variedade de tipos em vez de um único. Isso permite que os usuários consumam esses componentes e usem seus próprios tipos".
Ficou muito abstrata essa definição? Vamos desenvolver um exemplo simples.
Criando uma função sem Generics
Digamos que queremos criar uma função que concatena dois arrays de números. Fazemos o seguinte:
E se agora tivéssemos que concatenar dois arrays do tipo string. Como faríamos? Iríamos copiar o método e apenas alterar os tipos dos parâmetros e retorno?
Deu certo. Funciona!
Essa é uma alternativa, porém iríamos ao encontro de uma má pratica que é a duplicação de código.
Devemos evitar a duplicação de código promovendo a consistência, assim evitaremos a necessidade de fazer
alterações em várias partes do código, quando se alteram requisitos, por exemplo.
Porém alguém poderia dizer: "Isso é fácil de resolver. É só tipar com o tipo any". Vamos implementar dessa forma:
Realmente, isso funciona. Porém há um problema nessa abordagem. É possível adcionar um valor de qualquer tipo no array.
Um array de string aceita um number e vice-versa, por exemplo:
Talvez esse cenário seja o desejado. Mas na grande maioria das vezes, não é desejável a mistura de tipos em um array.
É nesse cenário que Generics nos ajudam.
Criando uma função com Generics
Para utilizar Generics, inserimos após a declaração do nome da função, na tipagem dos parâmetros e na tipagem do retorno da função o seguinte código: "<T>":
A utilização do "T" é uma convenção adotada por alguns, porém no lugar pode ser utiliza outra letra ou até uma palavra.
O importante é termos em mente que esse "<T>" será substituído pelo tipo informado ao se chamar a função.
Para deixar um pouco melhor essa função, poderíamos usar o operador spread na declaração dos parâmetros da função. Com ele podemos informar inúmeros parâmetros, que eles serão transformados em um array.
Apenas fique atento na chamada da função, onde o tipo é um array de um tipo.
Conclusão
Vimos aqui apenas um pequeno exemplo do poder de Generics, porém que já nos dá um grande vislumbre da infinidade de possibilidades. Criamos um método sem Generics e depois implementamos o mesmo método utilizando Generics. Isso já foi o suficiente para nos mostrar o quanto isso pode tornar poderoso o nosso código.