Programmiersprache: TypeScript 4.1 erlaubt Templates in String Literal Types

Neben den Template Literal Types führt das Release Recursive Conditional Types ein und ermöglicht das manuelle Setzen von Schlüsseln für Mapped Types.

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

(Bild: , gemeinfrei)

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

Nach einer zweimonatigen Betaphase ist nun TypeScript 4.1 erschienen. Die aktuelle Version erlaubt Vorlagen in String Literal Types und führt rekursive konditionale Typen ein. Außerdem dürfen Entwicklerinnen und Entwickler neuerdings für Mapped Types den Key über ein neues Schlüsselwort manuell festlegen.

Die neu eingeführten Template String Literal Types ermöglichen den Einsatz von Vorlagen innerhalb von String Literal Types. Die Syntax ist dieselbe wie bei den aus JavaScript bekannten Template String Literals, bezieht sich aber nicht auf Zeichenketten, sondern auf Typen wie in folgendem "Hello World"-Beispiel aus dem TypeScript-Blog:

type World = "world";
type Greeting = `hello ${World}`;
// entspricht:  type Greeting = "hello world";

Interessant ist die Neuerung vor allem beim Verknüpfen mehrerer String Literal Types, durch die sich das Produkt der jeweiligen Optionen als erlaubte Elemente ergibt, wie in folgendem Code aus dem Blog mit Bezug zum bekannten Kinderbuch von Dr. Seuss:

type Color = "red" | "blue";
type Quantity = "one" | "two";

type SeussFish = `${Quantity | Color} fish`;
// same as
//   type SeussFish = "one fish" | "two fish"
//                  | "red fish" | "blue fish";

Der Code kombiniert die beiden String Literal Types Color und Quantity und bietet damit beliebige Kombinationen aus den jeweils definierten Literalen für Anzahl und Farbe, aber eben nur dafür: "three fish" wäre nicht erlaubt, da in Quantity das entsprechende Literal nicht existiert.

TypeScript 4.1 ermöglicht zudem das manuelle Festlegen von Schlüsseln für Mapped Types. Mit Letzteren lassen sich Objekttypen anhand von Schlüsseln erstellen wie in type Beispiel = {[K in "a" | "b" | "c"]?: boolean}; oder als Erweiterung anderer Typen wie in type Partial<T> = {[K in keyof T]?: T[K]};.

Entwicklerinnen und Entwickler können mit dem neu eingeführte Schlüsselwort as individuelle Schlüssel festlegen. In Kombination mit den Template Literal Types lasen sich auf die Weise neue Property-Namen auf Basis vorhandener Namen festlegen.

Ein weiterer Neuzugang im aktuellen Release sind die Recursive Conditional Types. Sie bieten einen flexibleren Umgang mit konditionalen Typen, indem sie sich selbst referenzieren dürfen. Dabei gilt es jedoch zu beachten, dass TypeScript mehr Zeit für das Type-Checking rekursiver Typen benötigt.

Der Blogbeitrag rät daher zu einem sparsamen Einsatz und führt mit einem Augenzwinkern zwei extreme Beispiele auf: "Es mag lustig sein, auf die Weise zu versuchen, die Werte für das Collatz-Problem oder die Fibonacci-Folge zu modellieren, aber veröffentlicht das bloß nicht als .d.ts-Datei auf npm!"

Nennenswert ist zudem der neu eingeführte TypeScript-Parameter --noUncheckedIndexedAccess für den Zugriff auf Index Signatures:

interface Options {
  path: string;
  permissions: number;

  // Extra properties are caught by this index signature.
  [propName: string]: string | number;
}

Bisher ging TypeScript bei obigem Konstrukt davon aus, dass alle Properties entweder vom Typ string oder number sein müssen. Mit dem neuen Flag berücksichtigt der Compiler, dass der direkte Zugriffe auf solche Properties wie in foo.bar oder über den Index wie in foo["bar"] potenziell undefined sein können.

Neu ist zudem, dass TypeScript beim Aktivieren der Überprüfung von JavaScript-Code über den Kommandozeilenparameter --checkJs beziehungsweise die Konfiguration options.checkJs = true automatisch options.allowJs = true setzt. Das damit erlaubte Kompilieren von JavaScript-Inhalten ist ohnehin Voraussetzung für das Prüfen, und die Kombination checkJs: true, allowJs: false ist untersagt, wie der Pull Request zur Neuerung hervorhebt. Bisher mussten Entwicklerinnen und Entwickler den Wert dennoch manuell setzen.

Weitere Neuerungen wie der Einsatz von paths ohne baseUrl und einige Breaking Changes lassen sich dem TypeScript-Blog entnehmen. Im Vergleich zur Beta sind wie bei TypeScript üblich keine Neuerungen hinzugekommen. Entwicklerinnen und Entwickler können das Release über NuGet beziehen oder via npm mit npm install -D typescript installieren.

(rme)