Imagina que quieres una función que devuelva el primer elemento de un array. Funciona con números, strings, objetos... cualquier cosa.
Tu primera idea podría ser usar any:
Funciona, pero pierdes toda la información de tipo. num es any, no number. El autocompletado desaparece. Los errores de tipo no se detectan.
Los genéricos te permiten crear funciones que trabajan con cualquier tipo sin perder la información:
T es una variable de tipo. Cuando llamas a la función, TypeScript sustituye T por el tipo real.
<T> declara la variable de tipoT[] dice "un array de T" — sea lo que sea TT | undefined dice "devuelve un T o undefined"No necesitas especificar T manualmente. TypeScript lo deduce del argumento:
Pero puedes ser explícito si quieres:
Puedes usar más de una:
T — Type (el más común)U — segundo tipoK — KeyV — ValueNombres cortos por convención, pero puedes usar descriptivos: TElement, TKey, TValue.
primerElemento<T> que reciba un array de T y devuelva el primer elemento (o undefined)envolverEnArray<T> que reciba un valor y lo devuelva dentro de un arrayLos genéricos son como moldes: defines la forma una vez y la rellenas con cualquier material. Una función, infinitos tipos.