Programmiersprache: TypeScript 4.2 verteilt den Tupel-Rest flexibel

Rest-Elemente dürfen in Microsofts Programmiersprache neuerdings auch am Anfang oder der Mitte von Tupel-Deklarationen stehen.

Lesezeit: 1 Min.
In Pocket speichern
vorlesen Druckansicht Kommentare lesen 8 Beiträge

(Bild: , gemeinfrei)

Von
  • Rainald Menge-Sonnentag

Microsoft hat die erste Beta von TypeScript 4.2 veröffentlicht. Die augenscheinlichste Änderung betrifft Tupel, die nun Rest-Elemente nicht nur am Ende, sondern auch am Anfang oder in der Mitte haben dürfen. Außerdem behält die Programmiersprache Type Aliasse konsequenter bei und führt strengere Überprüfungen des in-Operators durch.

TypeScript erlaubt für Tupel seit geraumer Zeit Rest-Elemente, die ähnlich wie Rest-Parameter in JavaScript-Funktionen für eine beliebige Anzahl an Elementen stehen:

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. Allerdings ist nur ein Rest-Element erlaubt und dahinter darf kein weiteres 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?];

Auch wenn nach wie vor keine Rest-Parameter in Funktionen am Anfang oder Ende erlaubt sind, kann ein einzelnes Tupel als Parameter dasselbe Ziel erreichen:

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

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

Eine weitere Neuerung betrifft Type Aliasse, die TypeScript nun unter der Haube besser beibehält. Die Anpassung fällt vor allem im Zusammenspiel mit Entwicklungsumgebungen und Editoren wie Viusal Studio Code auf. Sie zeigen beim Überfahren mit der Maus üblicherweise den Alias statt des konkreten Typs an. Allerdings kann es bei Union-Types im Zusammenspiel mit undefined dazu kommen, dass die ursprünglichen Typen gezeigt werden. TypeScript 4.2 behält nun konsequent den Alias bei.

Außerdem versucht das aktuelle Release bereits beim Schreiben von Code den fehlerhaften Umgang mit dem Operator in anzumahnen, der nur für Objekttypen erlaubt ist und nicht für Primitive.

Darüber hinaus sind nun abstrakte Konstruktoren erlaubt, die wie abstrakte Klassen das Schlüsselwort abstract erhalten. Damit lässt sich kennzeichnen, dass der Konstruktor nicht direkt aufgerufen werden soll. Nicht abstrakte Konstruktortypen können dabei den abstrakten zugewiesen werden, 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, wie folgendes Beispiel aus dem zugehörigen Pull Request zeigt:

interface Mixin { ... }
abstract class Base { ... }

declare function Mixin1<TBase extends new 
  (...args: any[]) => {}>(base: TBase):
    TBase & (new (...args: any[]) => Mixin);

class Sub1 extends Mixin1(Base) { }
//                        ^^^^ TS2345: 
//    Argument of type 'typeof Base' is not assignable 
//    to parameter of type 'new (...args: any[]) => {}'.
//    Cannot assign an abstract constructor type to a 
//    non-abstract constructor type.

declare function Mixin2<TBase extends abstract new 
  (...args: any[]) => {}>(base: TBase):
    TBase & (new (...args: any[]) => Mixin);

class Sub2 extends Mixin2(Base) { } // Ok

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. Die Betaphase für TypeScript 4.2 ist für einen guten Monat angelegt. Am 9. Februar soll der Release Candidate erscheinen, und für den 23. Februar steht das fertige Release auf dem Plan.

(rme)