TypeScript 3.4 hat einen inkrementellen Compiler

Das JavaScript-Superset bietet neben dem --incremental-Flag einen komfortableren Umgang mit schreibgeschützten Arrays und Tupels.

In Pocket speichern vorlesen Druckansicht 4 Kommentare lesen
TypeScript 3.4 hat einen inkrementellen Compiler
Lesezeit: 4 Min.
Von
  • Rainald Menge-Sonnentag
Inhaltsverzeichnis

Microsoft hat den Release Candidate von TypeScript 3.4 veröffentlicht. Die typsichere JavaScript-Variante erweitert die im vorherigen Release eingeführten Methoden für inkrementelle Builds um ein spezifisches Compiler-Flag. Außerdem gibt die globale Variable globalThis Zugriff auf den jeweiligen globalen Scope. Schließlich lassen sich Arrays und Tupels als readonly deklarieren.

Erste Bemühungen für einen inkrementellen Build-Prozess brachte das im Januar veröffentlichte TypeScript 3.3 mit dem Zusammenführen von --build und --watch, um Dateien zu beobachten und nur veränderte zu kompilieren. Allerdings erfordert das Vorgehen einigen Aufwand, den das nun eingeführte Compiler-Flag --incremental umgeht.

Beim Verwenden des Flags erzeugt TypeScript eine Datei mit Build-Informationen im JSON-Format. Standardmäßig heißt die Datei ".tsbuildinfo" und liegt im Ausgabeverzechnis "./lib". Wenn die Datei existiert, prüft der Compiler tsc den Inhalt und baut nur die veränderten Projektteile. Fehlt sie, erstellt er die Datei für künftige Durchläufe. Über die Konfigurationsvariable outFile lässt sich ihr Name anpassen.

Die Build-Information gilt zunächst jeweils nur für das aktuelle TypeScript-Release. Eine neue Version erfordert somit zunächst den frischen Build von Projekten. Da die Datei zwar im JSON-Format, aber nur für die interne Verwendung durch tsc ausgelegt ist, sollten externe Werkzeuge beispielsweise zur Versionierung nicht darauf zugreifen.

Für schreibgeschützte Array kennt TypeScript zwar die eigene Klasse ReadonlyArray, deren Nachteil jedoch ist, dass einige Komfortfunktionen beziehungsweise syntaktischer Zucker regulärer Array-Objekte fehlen. Unter anderem lässt sich nicht mit number  direkt auf einzelne Elemente zugreifen. Der neu eingeführte Modifier readonly deklariert herkömmliche Arrays als schreibgeschützt, sodass weiterhin die komplette Syntax verfügbar bleibt, während das Hinzufügen, Löschen oder Ändern von Elementen untersagt ist, wie folgendes Beispiel aus dem Microsoft-Entwickler-Blog zeigt:

function foo(arr: readonly string[]) {
arr.slice(); // OK
arr.push("hello!"); // Fehler
}

Dieselbe Syntax funktioniert in TypeScript 3.4 auch für Tupels, was das Überschreiben der Elemente untersagt. Mit dem neuen Modifier arbeitet auch das Readonly-Utility wie erwartet, das zuvor keinen Effekt für Arrays und Tupels hatte. Während also früher das Ergebnis von type B = Readonly<number[]> einfach number[] war, ist es neuerdings das erwartete readonly number[]. Umgekehrt lassen sich schreibgeschützte Arrays und Tupels mit dem Writable-Utility wieder zu regulären Typen ohne Schreibschutz umformen.

Mit der Variable globalThis nimmt TypeScript 3.4 eine für das kommende ECMAScript 2019 geplante Neuerung voraus. Sie verallgemeinert den Zugang auf den globalen Scope. Bisher mussten Entwickler dafür unterschiedliche Objekte bemühen: Im Browser window, self, this oder frames, unter Node.js entweder global oder this. Die neue Variable globalThis gibt in allen Umgebungen Zugriff auf den globalen Scope und erkennt unter anderem ob Variablen dort mit const als schreibgeschützt deklariert sind.

Allerdings setzt TypeScript auf die native Umsetzung in JavaScript. Der Einsatz ist also nur zuverlässig in Browsern möglich, die bereits das neue JavaScript-Feature kennen. Eine Nebenwirkung der Neuerung ist zudem, dass die Variable this nun den Typ globalThis hat, statt wie bisher any.

Weitere Neuerung von TypeScript 3.4 lassen sich dem Entwickler-Blog bei Microsoft entnehmen. Derzeit hat das JavaScript-Superset noch den Status eines Release Candidate, mit der fertigen Variante ist jedoch erfahrungsgemäß und aufgrund der zweimonatigen Release-Zyklen in Kürze zu rechnen. (rme)