© GoodStudio/shutterstock.com
Spannende TypeScript-Neuerungen im Überblick

Starke Typen


TypeScript hat sich als Best Practice für die JavaScript-basierte Webentwicklung etabliert. Während Angular bereits seit Version 2 voll auf TypeScript setzt, kommt die typisierte JavaScript-Obermenge auch zunehmend in Angular-unabhängigen Webprojekten zum Einsatz. Das liegt am Mehrwert, den TypeScript gegenüber purem JavaScript bietet: Die statische Typisierung zeigt zur Compile-Zeit Fehler auf, zudem werden Entwickler durch Typinformationen beim Schreiben von Code unterstützt. TypeScript liegt zurzeit in Version 3.8 vor. Dieser Artikel zeigt die Entwicklung der Sprache ab Version 3.0 und stellt Neuerungen und Features vor.

Die Programmiersprache TypeScript wird von Microsoft öffentlich auf GitHub [1] weiterentwickelt. Dort hat das Team auch die komplette Roadmap [2] veröffentlicht. Ein Blick darauf lohnt sich: Neben vergangenen Meilensteinen enthält die Roadmap auch die kommende Version. Zudem finden sich dort Ideen für die Zukunft, die später höchstwahrscheinlich zu neuen Features der Sprache führen werden. Doch nun zu den interessantesten Features seit TypeScript 3.0.

Der unknown-Datentyp

Mit TypeScript 3.0 wurde der unkown-Datentyp eingeführt. Er ist das typisierte Gegenstück zum Datentyp any. Dieser ist schon seit TypeScript 1.0 Teil der Sprache und sollte verstanden worden sein, bevor man sich unknown zuwendet.

In TypeScript lässt sich jeder Typ dem any-Typ zuweisen. Das macht ihn zu einem sogenannten Top Type des TypeScript-Systems. So weit zur Theorie. In der Praxis bedeutet das, dass der TypeScript-Compiler für Variablen vom Typ any keine Prüfungen vornimmt. Der Compiler prüft weder, was zugewiesen wurde, noch, ob die verwendeten Properties oder Methoden auf dem Typ vorhanden sind. Er prüft wirklich gar nichts.

Das folgende Listing zeigt den any-Typ im Einsatz. Zuerst wird eine Zahl zugewiesen, dann ein boolescher Wert, dann der String Thomas. In der vierten Zeile wird die auf string verfügbare length-Property genutzt, um die Länge des Strings an der Console des Browsers auszugeben. Zuletzt wird die Methode printFullName aufgerufen. Der TypeScript-Compiler lässt erwartungsgemäß alles durchgehen. Erst zur Laufzeit wird in der letzten Zeile ein Fehler auftreten, da es die Methode printFullName auf dem der someValue-Variable zugewiesenen String nicht gibt.

let someValue : any = 5; someValue = true; someValue = 'Thomas'; console.log(someValue.length); someValue.printFullName();

Das nächste Listing zeigt den gleichen Codeausschnitt wie das vorige, mit einer Ausnahme: Die someValue-Variable hat nicht mehr den Typ any, sondern den Typ unknown. Der TypeScript-Compiler ist mit dem Zuweisen der Nummer 5, des booleschen Werts true und des Strings Thomas zufrieden. Dem unknown-Typ lässt sich ebenso wie any alles zuweisen. Beim Zugriff auf Mitglieder wie Properties und Methoden verhält sich der unknown-Typ jedoch ganz anders. Er geht davon aus, dass defaultmäßig keine Mitglieder bekannt sind. Somit wirft der Compiler im Listing zwei Fehler: Es wird bemängelt, dass weder die Property length auf dem unknown-Typ existiert, noch die printFullName-Methode.

let someValue : unknown = 5; someValue = true; someValue = 'Thomas'; console.log(someValue.length); // Compile-Fehler someValue.printFullName(); // Compile-Fehler

Jetzt kommt das Geniale am unknown-Typ: Die Fehler verschwinden, wenn explizit eine Typüberprüfung stattgefunden hat. Der unknown-Typ zwingt den Entwickler also, sauberen Code mit Typprüfungen zu schreiben. Listing 1 zeigt eine Variante mit unknown, die weder zur Kompilierzeit noch zur Laufzeit einen Fehler wirft. Zuerst wird eine Klasse Person erstellt, die eine printFullName-Methode hat, danach die someValue-Variable. Bevor auf die length-Property zugegriffen wird, wird mit einem if-Statement und dem typeof-Schlüsselwort geprüft, ob die someValue-Variable den Typ string enthält. Innerhalb des if-Statements ist somit sichergestellt, dass es sich um einen string handeln muss, und das weiß jetzt auch der schlaue TypeScript-Compiler: Innerhalb des if-Statements hat die someValue-Variable den Typ string, und nicht mehr den Typ unknown. Somit gibt der Compiler beim Zugriff auf die length-Property keinen Fehler mehr aus. Zudem erhält man innerhalb des if-Statements IntelliSense, womit sich alle Mitglieder des string-Typs über Code Completion einfügen lassen.

Im else-if-Block wird mit dem Schlüsselwort instanceof geprüft, ob die someValue-Variable eine Person enthält. Innerhalb dieses Blocks ist für den TypeScript-Compiler die someValue-Variable vom Typ Person. Somit gibt es beim Aufruf der printFullName-Methode keinen Fehler, da diese Methode auf der Person-Klasse existiert.

Listing 1: unknown type

class Person { printFullName() { console.log('Thomas Huber') } } let someValue: unknown = 5; someValue = true; someValue = 'Thomas'; if(typeof someValue === 'string'){ console.log(someValue.length); } else if (someValue...

Neugierig geworden? Wir haben diese Angebote für dich:

Angebote für Gewinner-Teams

Wir bieten Lizenz-Lösungen für Teams jeder Größe: Finden Sie heraus, welche Lösung am besten zu Ihnen passt.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang