Programmiersprache: TypeScript 4.0 bringt flexiblere Tupel mit

Tupel-Elemente dürfen den Spread-Operator flexibler verwenden. Die neue Version kommt zudem mit Zuweisungsoperatoren, die auch für ECMAScript 2021 anstehen.

In Pocket speichern vorlesen Druckansicht 51 Kommentare lesen
Schreibmaschine, Tastatur, Keyboard, Digitalisierung

(Bild: , gemeinfrei)

Lesezeit: 4 Min.
Von
  • Rainald Menge-Sonnentag
Inhaltsverzeichnis

Knapp zwei Monate nach der ersten Beta ist nun die endgültige Version von TypeScript 4.0 erschienen. Microsoft spendiert der Programmiersprache im aktuellen Release einige Ergänzungen für Tupel, die mehr Übersicht und Flexibilität bringen sollen. Das JavaScript-Superset bekommt zudem neue Zuweisungsoperatoren und kann Variablentypen aus dem Konstruktor ableiten.

Der Sprung auf eine (vermeintlich) neue Hauptversion ist nicht mit Inkompatibilitäten gegenüber den 3.x-Releases verbunden, da die Versionierung in einer Dezimalzählweise erfolgt, bei der neue Feature-Releases jeweils die Nachkommastelle um eins erhöhen und nach x.9 die Zahl vor dem Komma: TypeScript 4.0 folgt ebenso auf Version 3.9 wie vor zwei Jahren TypeScript 3.0 der Nachfolger des 2.9-Release war. Neue Releases erscheinen seit 2017 planmäßig alle zwei Monate.

Gleich drei Neuerungen im aktuellen Release betreffen Tupel. Zwei davon führt Microsoft unter dem Begriff Variadic Tuple Types ein. Variadisch bedeutet, dass die Zahl der Parameter bei der Deklaration nicht feststeht. In TypeScript steht der Spread-Operator ... für mehrere Elemente, Parameter oder Variablen.

Die neu eingeführten variadischen Tupel-Typen erlauben zum einen den generischen Einsatz von Spread-Elementen, also ohne einen konkreten Typ anzugeben. Beim Instanziieren oder Ersetzen durch feste Typen können die generischen Elemente wiederum zu Array- oder Tupel-Typen werden.

Neu ist zudem, dass die Spread-Elemente an einer beliebigen Stelle des Tupels stehen dürfen. Bisher waren sie lediglich am Ende erlaubt. So lassen sich unter anderem Tupel definieren, die zunächst eine flexible Zahl von Zeichenketten und anschließend eine von Zahlen haben:

type Strings = [string, string];
type Numbers = [number, number];
 
// [string, string, number, number]
type StrStrNumNum = [...Strings, ...Numbers];

Eine weitere Ergänzung für Tupel soll vor allem die Lesbarkeit für die Dokumentation und im Zusammenspiel mit Entwicklungsumgebungen und weiteren Tools verbessern: Die Elemente in Tupel dürfen Namen erhalten. Die Bezeichnungen haben keinerlei Einfluss auf das Destructuring der Tupel, also das Zerlegen in Variablen. Letztere dürfen nach wie vor beliebige Namen tragen und müssen nicht den Labels folgen.

Bemerkenswert ist noch, dass die Vergabe von Labels zwar optional ist, aber wenn ein Element einen Namen trägt, benötigen alle anderen Elemente ebenfalls einen.

Das aktuelle Release der Programmiersprache führt zudem drei neue Zuweisungsoperationen ein, und zwar für die logischen Und- beziehungsweise Oder-Operatoren, also && beziehungsweise || sowie den in TypeScript 3.7 eingeführten Nullish-Coalescence-Operator ??. Sie entsprechen im Wesentlichen den mathematischen Zuweisungsoperatoren wie +=. Allerdings schlagen sie nur dann zu Buche, wenn die logische Operation tatsächlich den Wert verändert, während mathematische Zuweisungen immer zu einer Berechnung führen.

Relevant ist das Detail für den Fall, dass Getter oder Setter Seiteneffekte haben, die beim Ändern auftreten. Während der Zuweisungsoperator a += b; so arbeitet wie a = a + b;, findet bei den logischen Operatoren Prüfungen statt, wie folgender Ausschnitt aus dem TypeScript-Blog zeigt:

obj.prop ||= foo();

// entspricht in etwa einem der 
// beiden folgenden Konstrukte

obj.prop || (obj.prop = foo());


if (!obj.prop) {
  obj.prop = foo();
}

JavaScript soll mit ECMAScript 2021 ebenfalls die Logical Assignment Operators auf dieselbe Art einführen.

TypeScript 4.0 leitet aus dem Konstruktor den Typ von Klassen-Properties ab, falls Letztere keine explizite Typdefinition besitzen. Wenn eine Zuweisung beziehungsweise Berechnung einer Property im Konstruktor beispielsweise den Typ string auferlegt, gilt der Typ allgemein für die Klassen-Property.

Durch die Analyse des Kontrollflusses weist TypeScript nur jenen Properties einen Typ zu, die auf jeden Fall im Konstruktor gesetzt sind. Wenn einige Zuweisungen nur bedingt auftreten, weil sie beispielsweise in einem if-Block stehen, gelten sie als potenziell undefined.

Weitere Änderungen in TypeScript 4.0 lassen sich Microsofts Entwicklerblog entnehmen. Der Beitrag führt zudem in Kurzform die Neuerungen der Programmiersprache seit Version 3.0 auf.

(rme)