Builders Academy
TypeScript — Du typage statique au niveau avancé
2 of 4

Chapitre 1 · Leçon 2

Génériques TypeScript

Écrire des fonctions et classes typées et réutilisables

Section 1

Fonctions génériques

Step 1

Le problème que les génériques résolvent

Sans génériques, tu dois choisir entre any (perd le typage) ou dupliquer le code pour chaque type. Les génériques permettent des fonctions typées ET réutilisables.

snippet.typescript

typescript
1// ❌ Sans générique : perd le type
2function first(arr: any[]): any {
3  return arr[0];
4}
5const num = first([1, 2, 3]); // type: any — TypeScript ne sait pas que c'est number
6
7// ✅ Avec générique : préserve le type
8function first<T>(arr: T[]): T | undefined {
9  return arr[0];
10}
11
12const num2 = first([1, 2, 3]);     // type: number | undefined ✓
13const str  = first(["a", "b"]);    // type: string | undefined ✓
14
15// Générique avec contrainte
16function getProperty<T, K extends keyof T>(obj: T, key: K): T[K] {
17  return obj[key];
18}
19
20const user = { id: "1", name: "Usher", age: 28 };
21const name = getProperty(user, "name"); // type: string ✓
22// getProperty(user, "missing"); ← Erreur TypeScript ✓

Step 2

Utility Types built-in

TypeScript fournit des utility types génériques très utiles. Ils évitent de réinventer la roue pour les transformations de types courantes.

snippet.typescript

typescript
1// ❌ Sans générique : perd le type
2function first(arr: any[]): any {
3  return arr[0];
4}
5const num = first([1, 2, 3]); // type: any — TypeScript ne sait pas que c'est number
6
7// ✅ Avec générique : préserve le type
8function first<T>(arr: T[]): T | undefined {
9  return arr[0];
10}
11
12const num2 = first([1, 2, 3]);     // type: number | undefined ✓
13const str  = first(["a", "b"]);    // type: string | undefined ✓
14
15// Générique avec contrainte
16function getProperty<T, K extends keyof T>(obj: T, key: K): T[K] {
17  return obj[key];
18}
19
20const user = { id: "1", name: "Usher", age: 28 };
21const name = getProperty(user, "name"); // type: string ✓
22// getProperty(user, "missing"); ← Erreur TypeScript ✓

Topics and skills covered

  • TypeScript
  • Génériques
  • Contraintes
  • Utility Types