Type Assertion (type-assertie) is een manier voor de ontwikkelaar om de TypeScript-compiler te laten weten hoe een waarde type verstaan moet worden. De syntaxis:
let someValue: any = "voorbeeld"; let strLen: number = (someValue as string).length;
Type Assertion verandert de gegevens niet op runtime, maar geeft alleen een aanwijzing aan de compiler over hun type. Als de assertie onjuist is, stopt het programma niet, wat kan leiden tot runtime-fouten. In tegenstelling tot "casting" in C# of Java, maakt TypeScript geen conversies.
Bij gebruik kan je geen assertion maken tussen niet-verwante types direct (bijvoorbeeld as number as User), maar er zijn omwegen via as unknown.
Is het veilig om dubbele assertie
value as unknown as Typete gebruiken om een waarde naar een ander type om te zetten?
Onjuiste antwoord: Ja, het is veilig, want dat is wat de meeste TypeScript-ontwikkelaars zeggen.
Juiste antwoord: Nee, dat is gevaarlijk. Deze techniek sluit de compiler-checks uit en staat toe om elk type in elk ander type om te zetten, waardoor typeveiligheid wordt omzeild, wat kan leiden tot fouten op runtime. Gebruik dit alleen als je zeker weet dat de waarde werkelijk compatibel is met het doeltype.
Verhaal
Een ontwikkelaar deed een Type Assertion voor een object van een externe API naar zijn eigen interface (
as MyType), zonder de velden te controleren. De API wijzigde de structuur en de applicatie begon te crashen bij het toegang tot niet-bestaande sleutels.
Verhaal
In een bibliotheek voor het werken met de DOM deed iemand een dubbele assertion
el as unknown as HTMLElement, zonder de type te verifiëren, en kreeg later een fout bij het proberen aanroepen van methods van HTMLElement op een ander object.
Verhaal
In een poging om type-fouten op te lossen tijdens de integratie met JS-code, paste een van de ontwikkelaars
as anytoe op de configuratie. Dit maskeerde het probleem, en de bug met onjuiste gegevensverwerking kwam alleen naar voren in productie.