Programmiersprache: TypeScript 4.0 erweitert den Umgang mit Tupels

Das JavaScript-Superset erlaubt den Einsatz des Spread-Operators ohne spezifische Typangabe sowie an beliebigen Stellen, und Tupel-Elemente dürfen Labels haben.

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

(Bild: , gemeinfrei)

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

Microsoft hat die erste Beta von TypeScript 4.0 veröffentlicht. Das Release konzentriert sich vor allem auf das Erweitern von Tupels, die die Methoden zum Verändern vereinfachen und die Dokumentation und das Tooling übersichtlicher gestalten sollen. Außerdem kann das JavaScript-Superset nun Variablentypen aus dem Konstruktor ableiten und führt zusätzliche Zuweisungsoperatoren ein.

Trotz des Sprungs auf eine neue Hauptversion gibt es im Vergleich zu dem vor einem Monat veröffentlichten TypeScript 3.9 keine größeren Änderungen, die zu Inkompatibilitäten führen. Das Team folgt lediglich der bisherigen Zählweise, in der es die Nebenversionen wie Nachkommastellen zählt. Vor zwei Jahren war TypeScript 3.0 der Nachfolger von 2.9.

Bei einer wesentlichen Neuerung wiederholt sich gewissermaßen die Geschichte von TypeScript: Wie in Version 3.0 stehen in der jüngsten Hauptversion die Tupels im Zentrum der Neuerungen. Unter dem Begriff Variadic Tuple Type fließen zwei Änderungen in die Sprache ein. Variadisch bedeutet in der Softwareentwicklung, dass die Zahl der Parameter bei der Deklaration nicht feststeht.

Beide Neuerungen betreffen den Spread-Operator .... Zum einen dürfen Entwickler Spreads neuerdings generisch in der Tupel-Syntax verwenden. Das ist unter anderem sinnvoll, um Teile von einem Array oder Tupel zu ermitteln, wie in folgender Funktion aus dem TypeScript-Blog:

function tail<T extends any[]>(arr: readonly [any, ...T]) {
const [_ignored, ...rest] = arr;
return rest;
}

Sie gibt alle Elemente außer dem ersten zurück – unabhängig von den verwendeten Typen. Bisher waren dazu zahlreiche überladene Funktionen nötig, die unterschiedliche Typen abdecken.

Die zweite Neuerung ist, dass Spread-Elemente nicht mehr nur am Ende eines Tupels, sondern an einer beliebigen Stelle erlaubt sind. Somit dürfen Entwickler nun Definitionen in folgender Form schreiben:

type Strings = [string, string];
type Numbers = [number, number];

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

Auf die Weise können sie beispielsweise das allgemeine Zusammenfügen von Tupels oder Arrays über eine concat-Funktion umsetzen:

function concat<T extends Arr, U extends Arr>
(arr1: T, arr2: U): [...T, ...U]
{
return [...arr1, ...arr2];
}

In TypeScript 4.0 dürfen die einzelnen Elemente eines Tupels Labels tragen. Die Namen sollen die Lesbarkeit verbessern und zielen vor allem auf die Dokumentation und das Zusammenspiel mit Programmierwerkzeugen. Die Labels sind optional, aber wenn ein Element einen Namen trägt, müssen alle anderen Elemente ebenfalls ein Label bekommen.

Die Bezeichnungen haben keinen Einfluss auf die Variablennamen beim Destructuring. Nach wie vor ist somit folgender Code erlaubt, der die Variablennamen a und b statt der Labels first und second verwendet:

function foo(x: [first: string, second: number])
{
// ...
let [a, b] = x;
// ...
}

TypeScript 4.0 leitet zudem den Typ von Klassen-Propertys aus dem Konstruktor ab, wenn die Propertys keine explizite Typdefinition besitzen. Wenn eine Zuweisung beziehungsweise Berechnung einer Property im Konstruktor beispielsweise den Typ number 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.

Nennenswert ist zudem, dass TypeScript nun auch die logischen Und- beziehungsweise Oder-Operatoren, also && beziehungsweise || sowie den in TypeScript 3.7 eingeführten Nullish-Coalescence-Operator ?? das direkte Zuweisen erlaubt.

Die Zuweisung erfolgt nur dann, wenn sie nötig ist, wenn also die Werte sich ändern. 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;, entspricht a ||= b; einer mit Klammern eingefassten Schreibweise a || (a = b);. Das Team spricht daher von einer kurzgeschlossenen (short-circuited) Zuweisung.

Weitere Neuerungen in TypeScript 4.0 wie das Erkennen einer mit /** @deprecated */als überholt markierten Deklaration lassen sich Microsofts Entwicklerblog entnehmen. Wer die Beta testen möchte, kann sie von NuGet herunterladen oder über npm mit dem Befehl npm install typescript installieren. Das endgültige Release von TypeScript 4.0 ist für den 18. August 2020 geplant.

(rme)