Cuando trabajamos con TypeScript, los genéricos son una herramienta fundamental para escribir código flexible y reutilizable. Pero, ¿qué ocurre cuando necesitamos manejar más de un genérico a la vez? Podemos declarar múltiples genéricos en una función, tipo o interfaz, separándolos por comas, de forma muy similar a cómo declaramos los parámetros de una función.
Por ejemplo, imaginemos que tenemos un tipo Respuesta que depende de dos genéricos: uno para un mensaje y otro para un valor adicional. Podríamos declararlo así:
type Respuesta<Mensaje, Extra> = {
mensaje: Mensaje;
extra?: Extra;
};
Al usar este tipo, debemos especificar ambos genéricos en el orden correcto, por ejemplo:
const respuesta1: Respuesta<string, number> = {
mensaje: "Hola",
extra: 42,
};
const respuesta2: Respuesta<boolean, object> = {
mensaje: true,
extra: { clave: "valor" },
};
Es importante recordar que el orden en que declaramos los genéricos importa, ya que al usarlos debemos respetar ese orden para que TypeScript asigne correctamente los tipos. Esto puede ser fuente de errores si no prestamos atención.
Un aspecto que suele pasar desapercibido es la elección de los nombres para los genéricos. Muchos cursos y ejemplos usan letras como T, U, X o K para nombrarlos, pero esto puede dificultar la comprensión del código, especialmente cuando hay varios genéricos involucrados. En TypeScript no hay ninguna restricción para usar nombres más descriptivos, y hacerlo mejora mucho la legibilidad.
Volviendo al ejemplo anterior, en lugar de usar T y U, podemos usar nombres como Mensaje y Extra, que nos indican claramente qué representa cada genérico. Esto facilita entender el código tanto para quien lo escribe como para quien lo lee después.
Esta práctica es especialmente relevante cuando trabajamos con librerías como React o Redux, donde los genéricos son omnipresentes. Por ejemplo, en React, al definir componentes genéricos, es común que las props se pasen como un genérico. Usar nombres descriptivos para estos genéricos ayuda a que el código sea más claro y mantenible.
De manera similar, en sistemas de acciones para Redux, es preferible nombrar los genéricos con términos que reflejen su propósito en lugar de letras arbitrarias. Esto hace que la API sea más amigable y comprensible.
Lamentablemente, no todas las librerías siguen esta buena práctica. Algunas, como ciertas implementaciones de Saga, utilizan letras genéricas sin significado, lo que puede complicar la lectura y el mantenimiento del código. Por eso, si estamos diseñando nuestras propias APIs o librerías, debemos esforzarnos por usar nombres descriptivos en los genéricos.
En definitiva, cuando trabajamos con múltiples genéricos en TypeScript, es fundamental no solo saber cómo declararlos correctamente, sino también elegir nombres que aporten claridad. Esto nos ahorrará confusiones y facilitará la colaboración con otros desarrolladores, además de mejorar nuestra propia experiencia al revisar el código en el futuro.