Intersectietypen (&, intersection types) stellen je in staat om meerdere typen te combineren tot één type dat alle eigenschappen van de samengevoegde typen heeft.
type Persoon = { naam: string }; type Werker = { baan: string }; type WerkendePersoon = Persoon & Werker; // { naam: string; baan: string } const wp: WerkendePersoon = { naam: "Leo", baan: "Dev" };
Dit is handig bij het samenstellen van uitbreidbare contracten en het bouwen van complexe types uit primitieve types.
Echter, als je incompatibele typen kruist (bijvoorbeeld, type A = { foo: string } en type B = { foo: number }), krijg je een type dat niet geïnitialiseerd kan worden.
type A = { foo: string }; type B = { foo: number }; type C = A & B; // C = { foo: never }
Wat gebeurt er als je twee typen kruist waarbij er een gemeenschappelijk veld is met incompatibele datatypes?
Antwoord: Het resultaat is een veld met het type never, aangezien de waarde niet tegelijkertijd een string en een getal kan zijn. Zo'n type kan niet geldig geïmplementeerd worden.
type T1 = { id: string }; type T2 = { id: number }; type T3 = T1 & T2; // { id: never }
Verhaal
In een project werden typen van verschillende bibliotheken gekruist zonder op te merken dat er dezelfde velden met verschillende types waren. Dit resulteerde in een onvoorspelbaar "nooit" (never) type, wat leidde tot de onmogelijkheid om een geldig object te creëren voor verzending naar de API.
Verhaal
Een ontwikkelaar moest typen van DTO en domeinentiteit "samenvoegen". In de intersectie waren er twee incompatibele eigenschappen, en de poging om het resulterende type te gebruiken veroorzaakte onduidelijke compilatiefouten. De ontwikkelaar verspilde tijd aan debugging voordat hij de oorzaak begreep.
Verhaal
In een van de microservices was er een intersectietype gedefinieerd om de body van een verzoek te beschrijven. Vanwege een wijziging in de API kreeg een van de eigenschappen een ander type, en de nieuwe wijzigingen leidden aanvankelijk niet tot een compilatiefout - problemen deden zich alleen voor tijdens de runtime na de deployment.