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 :
Exemple avec restriction de type :
function getFirst<T extends { length: number }>(arr: T): T { return arr[0]; }
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)
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.