ProgrammationDéveloppeur Backend

Qu'est-ce que la typisation des Generics en TypeScript, comment l'utiliser pour écrire des fonctions et classes universelles ? Quels écueils peuvent se présenter ?

Réussissez les entretiens avec l'assistant IA Hintsage

Réponse.

Les Generics (types génériques) permettent d'écrire un code universel qui fonctionne avec différents types, tout en maintenant une sécurité de type stricte.

Syntaxe d'utilisation :

function identity<T>(value: T): T { return value; } const x = identity<string>('test'); // T = string

Où les appliquent-ils :

  • Fonctions universelles de collections (map, filter, etc.)
  • Classes (par exemple, Repository<Entity>)
  • Interfaces (par exemple, réponse API de type générique)

Exemple avec restriction de type :

function getFirst<T extends { length: number }>(arr: T): T { return arr[0]; }

Question piège.

Question : Est-il obligatoire d'indiquer un type spécifique lors de l'appel d'une fonction avec un paramètre générique ?

Réponse :

Non, ce n'est pas obligatoire. TypeScript déduit (infère) lui-même les types à partir des valeurs passées, si possible. Mais parfois, il est pratique de les indiquer explicitement, par exemple si le type n'est pas clair à partir des valeurs ou s'il y a plusieurs options.

function identity<T>(value: T): T { return value; } identity(5); // T = number (auto) identity<string>('s'); // T = string (explicit)

Exemples d'erreurs réelles dues à l'ignorance des subtilités du sujet.


Histoire

Dans un projet e-commerce, un dépôt générique a été créé pour différentes entités, mais l'on a oublié la restriction de type. En conséquence, n'importe quel objet pouvait entrer dans le générique, et une fois, une entité avec des champs incompatibles a été sauvegardée. Les types n'ont pas protégé contre l'erreur.


Histoire

Une fonction générique a reçu un tableau, s'attendant à obtenir un tableau avec un type d'éléments. Mais la fonction renvoyait any[], car le générique n'avait pas été spécifiquement indiqué et TypeScript n'a pas pu déduire le type. L'erreur a été remarquée seulement en production.


Histoire

Un développeur débutant a créé une classe générique sans restriction de type, utilisant un champ qui n'existait pas dans tous les types. Le compilateur ne s'est pas plaint, mais lors de l'accès à une propriété inexistante, toute la fonctionnalité était cassée.