Geschichte der Frage:
Union Types wurden in TypeScript eingeführt, um Variablen und Parameter zu beschreiben, die Werte unterschiedlicher Typen annehmen können. Diese Möglichkeit hat die Flexibilität der Typisierung im Vergleich zu klassischen Programmiersprachen erheblich erweitert.
Problem:
In JavaScript sind Funktionen und Variablen oft mehrdeutig (z. B. können sie eine Zahl oder einen String annehmen), was eine sichere Typisierung erschwert. Ohne Union Types musste man 'any' verwenden oder den Code duplizieren. Dies erhöhte die Anzahl der Fehler in der Produktion und erschwerte die Zusammenarbeit in großen Teams.
Lösung:
Union Types ermöglichen es, eine Variable zu deklarieren, die einen von mehreren Typen annehmen kann, und garantieren korrekte Operationen nach der Überprüfung. Außerdem wird die Unterstützung für die Typverengung (Type Narrowing) bereitgestellt, was dem Compiler hilft, zu „verstehen“, womit er es zu tun hat.
Beispielcode:
function formatId(id: number | string): string { if (typeof id === 'string') { return id.toUpperCase(); } return id.toString(); }
Schlüsselfunktionen:
Kann man eine Union von Objekten mit unterschiedlichen Eigenschaften erstellen und auf jede Eigenschaft ohne Überprüfung zugreifen?
Nein. Union Types erlauben den Zugriff nur auf die Eigenschaften und Methoden, die in allen Typen vorhanden sind. Für den Zugriff auf spezifische Eigenschaften ist eine Typverengung erforderlich.
Beispielcode:
type Fish = { swim: () => void; }; type Bird = { fly: () => void; }; function move(animal: Fish | Bird) { // animal.swim(); // Fehler ohne Verengung if ('swim' in animal) { animal.swim(); // OK } }
Warum sind nicht alle Methoden für den Union Typ string | number verfügbar?
TypeScript erlaubt in Union nur das, was in allen enthaltenen Typen vorhanden ist. Für individuelle Methoden muss man zuerst den tatsächlichen Typ überprüfen.
Was passiert, wenn man den Typ in einer Union nicht prüft und versucht, eine spezifische Methode aufzurufen?
In diesem Fall tritt ein Kompilierungsfehler auf, da die Existenz der Methode nicht garantiert ist. Es funktioniert nur nach der Überprüfung des spezifischen Typs.
Der Variablen wurde der Typ string | number zugewiesen und ohne Überprüfung wurde toUpperCase() ausgeführt. Infolgedessen stürzt die Anwendung bei numerischen Daten ab.
Vorteile:
Nachteile:
Überprüfen wir den Typ vor der Arbeit mit der Methode:
if (typeof value === 'string') { return value.toUpperCase(); } else { return value.toString(); }
Vorteile:
Nachteile: