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.
- 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.
Der Rest in der Mitte
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?];
Paramterliste mit Elementen
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);
Alias bleibt Alias
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.
Abstraktes Konstrukt: abstrakter Konstruktor
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)