Type Assertion (Typ-Aussage) ist eine Möglichkeit für den Entwickler, dem TypeScript-Compiler mitzuteilen, wie der Typ eines Wertes interpretiert werden soll. Die Syntax:
let someValue: any = "Beispiel"; let strLen: number = (someValue as string).length;
Type Assertion wandelt die Daten zur Laufzeit nicht um, sondern gibt dem Compiler nur einen Hinweis auf ihren Typ. Wenn die Assertion fehlerhaft ist, wird das Programm nicht gestoppt, was zu Laufzeitfehlern führen kann. Im Gegensatz zum "Casting" in C# oder Java führt TypeScript keine Umwandlungen durch.
Bei der Verwendung kann man keine Assertion direkt zwischen nicht verwandten Typen machen (z. B. as number as User), aber es gibt Umgehungsmöglichkeiten über as unknown.
Ist es sicher, die doppelte Assertions
value as unknown as Typezu verwenden, um einen Wert in einen anderen Typ umzuwandeln?
Falsche Antwort: Ja, es ist sicher, weil die meisten TypeScript-Entwickler das so machen.
Richtige Antwort: Nein, es ist gefährlich. Diese Methode umgeht die Überprüfungen des Compilers und ermöglicht es, jeden Typ in jeden anderen zu verwandeln, wodurch die Typisierung umgangen wird, was zu Laufzeitfehlern führen kann. Verwenden Sie es nur, wenn Sie sicher sind, dass der Wert tatsächlich mit dem Zieltyp kompatibel ist.
Geschichte
Ein Entwickler machte eine Type Assertion für ein Objekt aus einer externen API als seinen eigenen Interface (
as MyType), ohne die Felder zu überprüfen. Die API änderte die Struktur und die Anwendung fiel beim Zugriff auf nicht existierende Schlüssel
Geschichte
In einer Bibliothek zur Arbeit mit dem DOM machte jemand eine doppelte Assertion
el as unknown as HTMLElement, ohne sich um den Typ zu kümmern, und erhielt später einen Fehler, als er versuchte, Methoden von HTMLElement auf einem anderen Objekt aufzurufen.
Geschichte
Um einen Typfehler bei der Integration mit JS-Code zu lösen, wandte einer der Entwickler
as anyauf die Konfiguration an. Dies versteckte das Problem, und der Fehler bei der falschen Datenverarbeitung trat nur in der Produktion auf.