Skip to content

Genéricos <T> en TypeScript

En TypeScript, <T> es una notación genérica que se utiliza para definir tipos genéricos. Los tipos genéricos permiten que funciones, clases, interfaces o tipos trabajen con múltiples tipos sin perder el control del tipado, proporcionando flexibilidad y reutilización de código.

¿Qué significa <T>?

  • T es una convención para denotar un parámetro gnérico de tipo
  • Es como una variable para tipos, que permite especificar el tipo que se usará en un tiempo de ejecución

Ejemplo sin genéricos:

function identidad(valor: any): any {
return valor;
}
const resultado = identidad(42); // Devuelve 42, pero el tipo es 'any'

El problema aquí es que TypeScript no sabe qué tipo retorna la función (any no es específico), por lo que no tiene tipado fuerte.

Ejemplo con genéricos:

function identidad<T>(valor: T): T {
return valor;
}
const resultado = identidad<number>(42); // Específicamente un 'number'
const texto = identidad<string>("Hola"); // Específicamente un 'string'
  • <T> indica que T es un parámetro de tipo
  • valor: T significa que el parámetro tiene el mismo tipo que se especifica al usar la función
  • La función retorna el mismo tipo (T)

Ventajas de los genéricos

  1. Reutilización de código: Puedes usar una única función o clase para trabajar con diferentes tipos.
  2. Tipado seguro: TypeScript infiere el tipo según el contexto, reduciendo errores.
  3. Flexibilidad: No necesitas definir explícitamente el tipo; se puede inferir automáticamente

Ejemplo con inferencia

TypeScript puede inferir automáticamente el tipo, sin necesidad de especificarlo explícitamente:

function identidad<T>(valor: T): T {
return valor;
}
const numero = identidad(42); // T se infiere como 'number'
const texto = identidad("Hola"); // T se infiere como 'string'

Clases genéricas

Los genéricos también son útiles para clases

class Caja<T> {
contenido: T;
constructor(contenido: T) {
this.contenido = contenido;
}
abrir(): T {
return this.contenido;
}
}
const cajaDeNumero = new Caja<number>(123);
console.log(cajaDeNumero.abrir()); // 123
const cajaDeTexto = new Caja<string>("Hola");
console.log(cajaDeTexto.abrir()); // "Hola"