Les génériques paramètrent un type, une fonction ou une interface par un ou plusieurs types, notés par exemple <T>. Ils permettent d'écrire du code réutilisable sans perdre la précision des types : le type d'entrée se retrouve dans la sortie. On peut les contraindre avec extends.
Exemple
function premier<T>(xs: T[]): T | undefined {
return xs[0];
}
const n = premier([1, 2, 3]); // number | undefined