cover

¿Qué son «Generics» en Typescript?

author photo

Héctorbliss

@hectorbliss

No necesitas generics realmente, si no estás reusando código.

TL;DR

Pero, si no volver a escribir lo ya escrito es lo tuyo, las generics te van a permitir definir funciones y clases que trabajan con una multitud de tipos.

Puzzle de madera ilustrando generics

Las «generics» han estado aquí en lenguajes como C# y Java. Con la capacidad de crear componentes que no sólo trabajan con un tipo de dato, sino con muchos.

Ahora que tenemos esta habilidad en TypeScript, lo mejor sería echarle un ojo, ¿no crees?

Ejemplo 1: Una función que agrega una llave a un objeto

Supongamos que tenemos una función que agrega una llave a un objeto.

Sin «generics» tendríamos que agregar sus tipos, tal vez así:

Pero esto no es muy útil, porque no sabemos qué tipo de objeto nos van a pasar, ni qué tipo de llave o valor.

Podríamos usar any:

Pero usar any es como no usar TypeScript. Perdemos toda la información de tipos. 😅


🎬 ¿Te está gustando este contenido? Tenemos más tutoriales de TypeScript en nuestro canal de YouTube.


Mejor usemos «generics»

Al invocar la función addNewKey estamos pasando los argumentos necesarios, pero también incluimos el tipo de estos argumentos: <string, string, UserType>. 🤯

A una función definida de esa forma, le llamamos generic function, ya que puede trabajar con una multitud de tipos.

A diferencia de trabajar con any, ahora no perdemos información en ningún punto de las invocaciones y retornos. ✅

Inferencia de tipos

Existe una segunda forma de invocar esta función: sin especificar los tipos.

Así es, el compilador de TS puede inferir los tipos a partir de los argumentos y colocar cada uno en las definiciones genéricas.

Esto puede ser útil con tipos sencillos, pero también puede fallar para tipos más complejos. Es mejor definirlos explícitamente.

Ejemplo 2: Una función real con extends

Veamos un ejemplo real de una función que obtiene un access token de Google:

Ejemplo de código con generics

BONUS: Extender tus generics

Puedes extender tus generics al definirlos, desde tipos presentes en el scope:

  • <Code extends string> - Code debe ser un string
  • <Env extends EnvObject> - Env debe tener la forma de EnvObject

Esto te da más control sobre qué tipos son válidos para tu función.

Seguro encontrarás mejores usos que yo, pero ¡oye! Ahora sabes usar generics. 🎉

Abrazo. bliss.

Enlaces relacionados

meta cover

Cómo activar el link correspondiente según la ruta anidada que coincida en Remix

Checa este otro Post

meta cover

3 cosas que debes saber sobre React Router Framework

Checa este otro Post

¡Nuevo curso!

Animaciones web con React + Motion 🧙🏻