Geschichte der Frage:
TypeScript implementiert statische Typisierung, daher ist es manchmal erforderlich, einen Typ explizit in einen anderen umzuwandeln. Zum Beispiel, wenn der Entwickler die Datenstruktur besser kennt als der Compiler oder wenn man mit einer typisierten API arbeiten muss, deren Ausgangstypen nicht mit den erwarteten übereinstimmen. Dafür wird der Mechanismus des Type Castings oder Typ-Assertions verwendet.
Problem:
Typumwandlungen (Type Casting) in TypeScript führen keine Werte umwandlungen zur Laufzeit durch: Sie teilen nur dem Compiler mit "Vertraue mir". Dies kann zu Fehlern führen, wenn der angegebene Cast nicht mit dem tatsächlichen Inhalt der Daten übereinstimmt. Fehler treten erst zur Laufzeit auf und werden vom Compiler nicht erkannt.
Lösung:
In TypeScript sind zwei Syntaxen für die Typumwandlung enthalten: Angle-Bracket (veraltet, nicht empfohlen für JSX) und die as-Syntax (empfohlen).
Beispielcode:
// Syntax über spitze Klammern (nicht für .tsx) let someValue: any = "Hallo Welt"; let strLength: number = (<string>someValue).length; // Syntax über as let strLength2: number = (someValue as string).length; // Typumwandlung eines Objekttyps (unsicher!) interface Cat { meow(): void; } interface Dog { bark(): void; } let dog: Dog = { bark() {} }; let cat = dog as unknown as Cat; // das ist möglich, umgeht aber die Typisierung!
Schlüsselmerkmale:
Führt Type Assertion eine automatische Umwandlung von Werten zur Laufzeit durch, wie in C# oder Java?
Nein, Type Assertion weist nur den Compiler darauf hin, dass die Variable diesen Typ hat. Es erfolgt keine Umwandlung von Werten — die Verantwortung liegt vollständig beim Entwickler.
Kann man Typ A in Typ B umwandeln, ohne dass eine gemeinsame Struktur vorhanden ist?
TypeScript erlaubt dies (durch doppeltes Casting, zum Beispiel any oder unknown), aber das untergräbt die Typensicherheit und kann zu Laufzeitfehlern führen.
const a = 5 as unknown as string; // nicht sicher!
Ist es sicher, any in einen komplexen Typ umzuwandeln?
Nein, any deaktiviert die Typprüfung: Die Umwandlung von any in einen anderen Typ ist möglich, aber TypeScript kann keine Unstimmigkeiten erfassen, alle Fehler treten erst bei der Ausführung auf.
Ein Entwickler erhält ein objekt von einem Server, ohne die Struktur zu überprüfen, wandelt es mit einfachem as SomeType um und verwendet es in der Geschäftslogik. Bei einer API-Änderung oder einem Bug auf dem Server stürzt die Anwendung zur Laufzeit ab, ohne Fehler während des Build-Prozesses.
Vorteile:
Nachteile:
Ein Entwickler validiert vorher die Struktur des empfangenen Objekts, verwendet eine benutzerdefinierte Type Guard-Funktion und erst nach erfolgreicher Überprüfung erfolgt die Type Assertion.
Vorteile:
Nachteile: