© istockphoto.com/chuntise, © istockphoto.com/NREY
Typsicheres JavaScript mit TypeScript

Starke Typen


Eine häufig kritisierte Eigenschaft von JavaScript ist die Abwesenheit eines Typsystems im Sprachkern. Um dieses Problem zu lösen, gibt es zahlreiche Projekte, die der Sprache dieses Feature hinzufügen. Bemerkenswert dabei ist, dass sich auch große namhafte Unternehmen wie Microsoft, Google oder Facebook dieses Themas annehmen.

Die Frage, die sich nun aber aufdrängt, ist: Warum sollte man typsicheres JavaScript wollen?

Typsicherheit zielt in eine ähnliche Richtung wie Tests; sie soll in erster Linie Fehler bei der Entwicklung verhindern, hat jedoch noch weitere positive Nebeneffekte auf die Entwicklung. Grundsätzlich kann mit einem Typsystem verhindert werden, dass einer Variablen die verschiedensten Werte zugewiesen werden. Die Ausnutzung dieser Flexibilität ist ein häufig anzutreffendes Anti-Pattern in JavaScript-Applikationen. Das Problem wird deutlicher, wenn man sich vorstellt, dass man einer Variablen zunächst einen Booleschen Wert wie false zuweisen und sie danach mit einem Array, einem Objekt oder gar einer Funktion verwenden kann. Wird der Wert der Variablen dann als Rückgabewert innerhalb einer Funktion genutzt, muss man entweder raten, welche Art von Wert man erhält, oder den Quellcode der Funktion lesen.

Was für den Rückgabewert einer Funktion gilt, gilt im gleichen Maß auch für ihre Parameter. JavaScript ist sehr tolerant, wenn es um Parameter geht. Man kann sowohl zu viele als auch zu wenige Werte an eine Funktion übergeben, außerdem macht JavaScript keinerlei Annahmen bezüglich des Typs eines Werts. Basiert die Logik der Funktion auf einer bestimmten Struktur der übergebenen Werte und stimmt die erwartete Struktur nicht mit der tatsächlich übergebenen überein, kommt es zu Fehlern. Eine Möglichkeit zum Umgang mit dieser Art der Problemstellung ist die explizite Überprüfung der Struktur und das Werfen einer Exception, falls die Struktur nicht passt. Ein zentrales Feature eines Typsystems ist der Umgang mit dieser Art von Problemstellung.

Nicht zu unterschätzen ist der dokumentierende Charakter eines Typsystems. Gerade die Beschreibung der Signatur einer Funktion oder die Deklaration von Variablen hilft bei der Dokumentation einer Applikation. Interessant ist sie vor allem, wenn man Bibliotheken oder zumindest innerhalb einer Applikation wiederverwendbare Komponenten erstellt.

Damit man ein solches System aber auch wirklich optimal einsetzen kann, sollte man zumindest einen groben Überblick über die Funktionsweise haben.

Wie funktionieren Typsysteme in JavaScript generell?

Nachdem JavaScript keinerlei Unterstützung für Typsicherheit mit sich bringt, müssen sich die Entwickler eines solchen Systems anderweitig behelfen. Soll der Grundsprache JavaScript neue Funktionalität hinzugefügt werden, führt der Weg in der Regel über einen Compiler, der den erweiterten Quellcode in Standard-JavaScript übersetzt. Diese Systematik wird jedoch nicht nur bei solchen Typaufsätzen eingesetzt, sondern kommt auch beispielsweise bei CoffeeScript oder ECMAScript-6-in-ECMAScript-5-Transpilern wie Traceur oder Babel zum Einsatz. Das führt dazu, dass die Typen nur zur Compile-Zeit und nicht zur Laufzeit geprüft werden – was wiederum bedeutet, dass man typsicheres JavaScript schreibt und es in Quellcode kompilieren muss, den ein Browser versteht. Bevor man also das Ergebnis der Programmierung sehen kann, muss dieser Compile-Schritt ausgeführt werden. Zu diesem Zweck gibt es einige Hilfsmittel wie beispielsweise Watcher für den Compiler. Sie verfolgen Änderungen in den Quellcodedateien, stoßen so bei jedem Speichervorgang den Compiler an und erstellen damit den Quellcode für den Browser automatisch, sodass man sich nicht ständig selbst darum kümmern muss. Auch einige Entwicklungsumgebungen unterstützen bei der Entwicklung, indem sie solche Watch­er mitbringen.

Warum sollte man sich nun für TypeScript entscheiden?

Wie in JavaScript üblich, gibt es nicht nur ein Typsystem, für das man sich entscheiden kann, sondern gleich mehrere, von denen jedes Vor- und Nachteile mit sich bringt. Dieser Artikel beschäftigt sich mit TypeScript [1], einem der bekanntesten und verbreitetsten Typsysteme für JavaScript. Das hat einige Gründe. TypeSript existiert seit 2012 und liegt aktuell in der Version 1.4 vor. Maßgeblich verantwortlich für die Entwicklung ist Anders Hejlsberg, ein Entwickler von Microsoft, der unter anderem für seine Arbeit an Delphi, Turbo Pascal und C# ausgezeichnet wurde. Die sich momentan in der Entwicklung befindliche Version 1.5 hat mittlerweile das Betastadium erreicht, was im Internet so viel bedeutet wie: man kann es bereits vorsichtig im Produktivbetrieb einsetzen. Da TypeScript schon etwas länger auf dem Markt ist, verfügt es nicht nur über einen recht beeindruckenden Funktionsumfang, sondern weist auch eine gewisse Stabilität auf. Für die längerfristige Planung und den Einsatz in Projekten ist das von wesentlicher Bedeutung.

Ein weiterer Grund, der für den Einsatz von Type­Script spricht, ist, dass die Sprache in letzter Zeit einen sehr bekannten Unterstützer gewonnen hat: Google. Vor allem für die Entwicklung von AngularJS 2.0 entwickelte Google sein eigenes Typsystem, AtScript. Die Entwicklung dieser Sprache wurde allerdings zugunsten von TypeScript eingestellt, das nun in AngularJS 2.0 zum Einsatz kommt. Mit Google und Microsoft als Unterstützer stehen zwei sehr große Unternehmen hinter der Sprache. Hierauf sollte man sich allerdings nicht allzu sehr verlassen, denn gerade Google ist dafür bekannt, die Unterstützung für Technologien sehr schnell zu ändern.

Aber zurück zu TypeScript. Was rein technisch für TypeScript spricht, ist die sehr einfache Installation und damit die Verfügbarkeit auf verschiedensten Systemen. Der TypeScript-Compiler ist in JavaScript geschrieben und basiert auf Node.js. Das bedeutet, dass Sie Type­Script sowohl unter Windows als auch unter Linux und Mac OS verwenden können.

Da es sich bei TypeScript, wie schon erwähnt, lediglich um einen Aufsatz auf JavaScript handelt, wird der TypeScript-Quellcode in JavaScript umgewandelt. Zu diesem Zweck kommt ein Compiler zum Einsatz. Das hat den Vorteil, dass der einzige Overhead zu diesem Zeitpunkt und nicht zur Laufzeit entsteht. Das heißt, dass TypeScript keine negativen Auswirkungen auf die Ausführung einer Applikation hat. Der Compiler generiert aktuell standardmäßig ECMAScript-3-kompatiblen Quellcode. Dieses Verhalten kann durch die Kommandozeilenoption –v (oder --version) des Compilers angepasst werden.

Eine weitere Annehmlichkeit, die ein Typsystem und damit auch TypeScript mit sich bringt, ist, dass eine Entwicklungsumgebung besser beim Schreiben von Quellcode unterstützen k...

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