Un générique n'est pas « un type qu'on ignore ». C'est une relation entre des types.A generic isn't "a type you don't know". It's a relation between types.
Le Vol 4 parlait d'abandonner le type. Le générique fait l'inverse : il le garde, et le fait voyager. Une fonction qui doit marcher pour plusieurs types tombe vite dans le piège du any — qui rompt tout lien entre ce qui entre et ce qui sort, et débranche la vérification. <T> dit autre chose : « quel que soit le type d'élément, le type de retour est le même ». Ce n'est pas une inconnue, c'est un fil tendu entre deux positions.Vol 4 was about abandoning the type. The generic does the opposite: it keeps it, and makes it travel. A function meant to work for several types quickly falls into the any trap — which severs any link between what comes in and what goes out, and unplugs checking. <T> says something else: 'whatever the element type, the return type is the same'. It's not an unknown, it's a thread strung between two positions.
function first(arr: any[]): any { // any : aucun lien entre l'entrée et la sortie return arr[0]; } const u = first(users); // u : any ← le type d'élément est perdu u.nme; // ✗ faute de frappe — aucune erreur, any déteint (Vol 4)
any et <T> acceptent tous deux n'importe quel type d'élément. Mais any oublie lequel ; <T> s'en souvient et le rend à la sortie — un seul code, et la vérification tient pour chaque type.Both any and <T> accept any element type. But any forgets which one; <T> remembers it and returns it at the output — one body, and checking holds for every type.
function first<T>(arr: T[]): T | undefined { // <T> RELIE : type d'élément = type de retour return arr[0]; // (| undefined : le tableau peut être vide) } const u = first(users); // u : User | undefined ← T inféré à User au site d'appel u?.nme; // ✗ 'nme' n'existe pas sur User — attrapé
« Ce <T> — qu'est-ce qu'il relie ? » Un générique gagne sa lettre en connectant au moins deux positions (un paramètre au retour, deux paramètres entre eux). S'il ne relie rien, ce n'est pas un générique : c'est un any avec un chapeau."This <T> — what does it relate?" A generic earns its letter by connecting at least two positions (a parameter to the return, two parameters together). If it relates nothing, it's not a generic: it's an any with a hat.
Après les échappatoires, le polymorphisme. Le générique est la réponse positive à « ce code marche-t-il pour plusieurs types ? » : oui, sans rien abandonner de la vérification. Le reste du volume affine la maille — contraindre juste assez (5.2), comprendre la variance (5.3). Mais tout part de cette idée : <T> est une relation, pas une inconnue.After the escape hatches, polymorphism. The generic is the positive answer to 'does this code work for several types?': yes, abandoning none of the checking. The rest of the volume refines the mesh — constrain just enough (5.2), understand variance (5.3). But it all starts here: <T> is a relation, not an unknown.