Es una forma de decirle a TypeScript que un tipo puede ser dinámico, es decir, que no se conoce exactamente hasta que se usa. Nos permite escribir código reutilizable y flexible, sin perder la seguridad de tipos.
Ejemplo:
function wrapInArray<T>(element: T): T[] {
return [element];
}
const numero = wrapInArray<number>(5); // number[]
const texto = wrapInArray<string>("hola"); // string[]
Donde T
es el tipo dinamico.
También se pueden pasar varios tipos dinámicos
function combinar<T, U>(a: T, b: U): [T, U] {
return [a, b];
}
const resultado = combinar<string, number>("edad", 25); // ["edad", 25]
Se pueden definir tipos por default 🥴
function obtenerElemento<T = string>(elemento: T): T {
return elemento;
}
const porDefecto = obtenerElemento("hola"); // T es string
const personalizado = obtenerElemento<number>(5); // T es number
Si no le definimos su "tipado", lo infiere automáticamente.
function duplicar<T>(valor: T): [T, T] {
return [valor, valor];
}
const res = duplicar(42); // Infiere que T es number