ProgrammationDéveloppeur Backend TypeScript

Parlez-moi du mécanisme des 'types d'intersection' (intersection types) dans TypeScript. Comment les utiliser correctement et quels pièges peut-on rencontrer ?

Réussissez les entretiens avec l'assistant IA Hintsage

Réponse

Les types d'intersection (&, intersection types) permettent de combiner plusieurs types en un seul, possédant toutes les propriétés des types combinés.

Exemple:

type Person = { name: string }; type Worker = { job: string }; type WorkingPerson = Person & Worker; // { name: string; job: string } const wp: WorkingPerson = { name: "Leo", job: "Dev" };

C'est pratique pour la composition de contrats extensibles et la construction de types complexes à partir de primitifs.

Cependant, si des types incompatibles se croisent (par exemple, type A = { foo: string } et type B = { foo: number }), le type résultant ne pourra pas être initialisé.

Exemple de croisement incorrect:

type A = { foo: string }; type B = { foo: number }; type C = A & B; // C = { foo: never }

Question piégeuse

Que se passe-t-il si on croise deux types ayant un champ identique avec des types de données incompatibles ?

Réponse : On obtient un champ de type never, car une valeur ne peut pas être à la fois une chaîne et un nombre. Un tel type ne peut pas être implémenté de manière valide.

type T1 = { id: string }; type T2 = { id: number }; type T3 = T1 & T2; // { id: never }

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


Histoire

Dans un projet, on a croisé des types provenant de bibliothèques différentes sans remarquer qu'il y avait des champs identiques avec des types différents. En conséquence, on obtient un type 'impossible' (never) qui empêche de créer un objet valide à transmettre à l'API.


Histoire

Un développeur devait 'coller' des types DTO et d'entités de domaine. Dans l'intersection, deux propriétés incompatibles se trouvaient, et la tentative d'utiliser le type résultant a généré des erreurs de compilation ambiguës. Le développeur a passé du temps à déboguer avant de comprendre la cause.


Histoire

Dans l'un des microservices, un type croisé a été déclaré pour décrire le corps de la requête. Suite à un changement de l'API, une des propriétés a reçu un type différent, et ces changements n'ont pas immédiatement entraîné d'erreurs de compilation — les problèmes sont apparus seulement à l'exécution après le déploiement.