Programmiersprache: TypeScript 4.2 führt Buch über Typ-Aliasse

Neben der Beibehaltung von Alias-Deklarationen erlaubt Microsofts Programmiersprache neuerdings für Tupel Rest-Elemente in der Mitte oder am Anfang.

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

(Bild: , gemeinfrei)

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

Sechs Wochen nach der ersten Beta ist planmäßig das offizielle Release von TypeScript 4.2 erschienen. Zu den nennenswerten Neuerungen gehört, dass Tupel nicht nur am Ende, sondern auch am Anfang und in der Mitte Rest-Elemente haben dürfen. Außerdem ändert Microsofts Programmiersprache die interne Verarbeitung von Typ-Alias-Deklarationen, was vor allem im Zusammenspiel mit Entwicklungsumgebungen und Editoren mehr Klarheit bringen soll.

TypeScript erlaubt die Deklaration eines neuen Namens für eine Reihe von Typen. Wenn mehrere Funktionen als Übergabeparameter beispielsweise die Typen number, string und boolean erlaubt, können Entwicklerinnen und Entwickler sie in einem gemeinsamen type zusammenfassen:

type TypenAuswahl = number | string | boolean;

Anschließend lässt sich der Alias-Typ als Parameter in Funktionen verwenden. Entwicklungswerkzeuge wie Visual Studio Code sollten unter anderem beim Überfahren mit der Maus die passende Deklaration des Alias statt der einzelnen Typen anzeigen. Bisher kam es jedoch zu Problemen, wenn eine Funktion zusätzlich den Wert undefined zurückgeben kann:

export function dummy(value: TypenAuswahl) {
  if (Math.random() < 0.5) {
    return undefined;
  }
  return value;
}

Bis TypeScript 4.1 zeigten die Werkzeuge in dem Fall als Rückgabewert string | number | boolean | undefined statt der gewünschten, übersichtlicheren Ausgabe TypenAuswahl | undefined an. Das lag daran, dass TypeScript intern Union-Typen, die wiederum Unions enthalten, zusammenfasst. Sowohl die TypAuswahl als auch die möglichen Rückgabewerte als TypAuswahl und undefined sind Unions.

TypeScript 4.2 führt nun Buch darüber, wie die jeweiligen Union-Typen entstanden sind, und kann daher die ursprünglichen Typen und damit den anfangs definierten Typ-Alias korrekt erkennen und in der Entwicklungsumgebung anzeigen.

Eine weitere Neuerung betrifft Tupel, die nun Rest-Elemente nicht nur am Ende, sondern auch am Anfang oder in der Mitte haben dürfen. Bis TypeScript 4.1 waren Rest-Elemente in einer ähnlichen Form erlaubt wie Rest-Parameter in JavaScript-Funktionen. Sie sind mit drei führenden Punkten ... ausgezeichnet und stehen für eine beliebige Anzahl von Elementen:

let resterampe: [string, string, ...number[]];

// Das Tupel enthält immer genau zwei Strings
// außerdem darf eine beliebige Anzahl an Zahlen am Ende stehen

resterampe = ["keine", "Zahlen"];
resterampe = ["eine", "Zahl", 1];
resterampe = ["viele", "Zahlen", 1, 2, 3, 4];

Bisher durfte das Rest-Element dabei ebenso wie der Rest-Parameter in JavaScript nur am Ende stehen. TypeScript 4.2 erlaubt den Einsatz nun ebenfalls am Anfang und in der Mitte der Elementliste. Für den Einsatz gelten zwei Einschränkungen: Unabhängig von der Position ist nur ein Rest-Element im Tupel erlaubt, und hinter dem Rest darf kein optionales Element folgen:

// ein einzelnes Rest-Element ist an beliebiger Position erlaubt
let erlaubtA: [...string[], boolean];
let erlaubtB: [number, ...string[], boolean];

// zwei Rest-Elemente sind nicht gestattet
let verbotenA: [...string[], ...boolean[]];

// auch darf auf das Rest-Element kein optionales folgen
let verbotenB: [...string[], boolean?];

Dank der Neuerung sind Funktionen mit einem flexiblen Rest-Parameter möglich. Die direkte Deklaration eines solchen Parameters am Anfang oder in der Mitte sind weiterhin nicht erlaubt, aber ein Tupel als Parameter führt auf indirektem Weg zum selben Ziel:

declare function flexibel 
  (...args: [...texte: string[], zahl: number]): void;

flexibel (0);
flexibel ("do", 1);
flexibel ("do", "re", "mi", 3);

TypeScript 4.2 erlaubt zudem abstrakte Konstruktoren mit dem Schlüsselwort abstract, das kennzeichnet, dass der jeweilige Konstruktor nicht direkt aufgerufen werden soll. Nicht abstrakte Konstruktortypen lassen sich den abstrakten zuweisen, aber der umgekehrte Weg ist untersagt.

Wie für abstrakte Klassen gilt, dass das Instanziieren über new für Elemente mit abstrakten Konstruktoren nicht gestattet ist. Die Neuerung zielt unter anderem darauf, Mixins mit abstrakten Klassen zu realisieren

Weitere Neuerungen in TypeScript 4.2 wie die Umsetzung von Template Literal Expressions über die in Version 4.1 eingeführten Template Literal Types lassen sich dem TypeScript-Blog entnehmen. Das Release steht über NuGet zur Verfügung oder lässt sich mit npm install typescript installieren.

(rme)