Schnittmengen-Typen (&, intersection types) ermöglichen es, mehrere Typen zu einem zu kombinieren, der alle Eigenschaften der kombinierten Typen besitzt.
type Person = { name: string }; type Worker = { job: string }; type WorkingPerson = Person & Worker; // { name: string; job: string } const wp: WorkingPerson = { name: "Leo", job: "Dev" };
Das ist nützlich bei der Komposition erweiterbarer Verträge und beim Aufbau komplexer Typen aus Primitiven.
Wenn jedoch inkompatible Typen (z. B. type A = { foo: string } und type B = { foo: number }) überschneidet werden, entsteht ein Typ, den man nicht initialisieren kann.
type A = { foo: string }; type B = { foo: number }; type C = A & B; // C = { foo: never }
Was passiert, wenn man zwei Typen überschneidet, die dasselbe Feld mit inkompatiblen Datentypen haben?
Antwort: Es entsteht ein Feld mit dem Typ never, da der Wert gleichzeitig nicht sowohl eine Zeichenkette als auch eine Zahl sein kann. Solch einen Typ kann man nicht gültig implementieren.
type T1 = { id: string }; type T2 = { id: number }; type T3 = T1 & T2; // { id: never }
Geschichte
Im Projekt wurden Typen aus verschiedenen Bibliotheken überschneidet, ohne zu bemerken, dass es identische Felder mit unterschiedlichen Typen gab. Infolgedessen entstand ein unerwarteter "unmöglicher" (never) Typ, der zur Unmöglichkeit führte, ein gültiges Objekt zur Übergabe an die API zu erstellen.
Geschichte
Der Entwickler musste die Typen von DTO und Domänenentitäten "verkleben". In der Schnittmenge waren zwei inkompatible Eigenschaften, und der Versuch, den resultierenden Typ zu verwenden, führte zu mehrdeutigen Kompilierungsfehlern. Der Entwickler verbrachte Zeit mit dem Debuggen, bevor er die Ursache verstand.
Geschichte
In einem der Mikrodienste wurde ein überschneideter Typ für die Beschreibung des Anfragekörpers deklariert. Aufgrund einer API-Änderung erhielt eine der Eigenschaften einen anderen Typ, und die neuen Änderungen führten nicht sofort zu einem Kompilierungsfehler - die Probleme traten erst zur Laufzeit nach dem Deployment auf.