Menü

TypeScript 3.7: Die ??? und der übersichtlichere Code

Das aktuelle Release der Skriptsprache führt den Nullish-Coalescing-Operator und das Optional Chaining ein.

Lesezeit: 2 Min.
In Pocket speichern
vorlesen Druckansicht Kommentare lesen 63 Beiträge
Von

Microsoft hat turnusmäßig TypeScript 3.7 veröffentlicht. Das JavaScript-Superset bringt im aktuellen Release zahlreiche sprachliche Neuerungen mit und nimmt damit erneut einige kommende Features von ECMAScript vorab in die Syntax auf. Sowohl Optional Chaining als auch der Nullish-Coalescing-Operator sind Bestandteil des neuen TypeScript-Release, und beide sollen Einzug in den Kern von JavaScript halten.

Das Optional Chaining gehört zu den ältesten Wünschen der Entwickler für TypeScript. Das zugehörige Issue hat die Nummer 16 von derzeit gut 23.000 Issues und existiert seit fünf Jahren. Optional Chaining, also die optionale Verkettung, soll auch Bestandteil von ECMAScript werden und gilt in JavaScript derzeit als experimentell.

Die zugehörige Syntax sieht ein Fragezeichen vor, das innerhalb einer verketteten Anweisung eine null-Prüfung vornimmt. So ersetzt folgende Codezeile aus dem TypeScript-Blog

let x = foo?.bar.baz();

folgenden Block:

let x = (foo === null || foo === undefined) ?
undefined :
foo.bar.baz();

Konkret testet das ?, ob foo definiert ist und führt nur dann die weitere Berechnung durch. Ansonsten gibt die Anweisung undefined zurück. Erwähnenswert ist, dass die Prüfung sich nur auf den Wert vor dem ? bezieht. Sollte foo.bar nicht definiert sein, führt die Zeile zur einer Fehlermeldung.

Der Nullish-Coalescing-Operator soll ebenfalls Bestandteil von ECMAScript werden und befindet sich derzeit in der dritten und damit vorletzten Stufe (Candidate Stage) beim TC39-Komitee. In anderen Programmiersprachen heißt der Binäroperator auch Null Coalescing und existiert in unterschiedlichen Schreibweisen. Für TypeScript ist ebenso wie in ECMAScript ein doppeltes Fragezeichen dafür vorgesehen. Der Operator ersetzt undefinierte Werte durch einen Standardwert.

Folgende Codezeile

let x = foo ?? bar();

weist der Variable x den Wert von foo zu, wenn er weder null noch undefined ist. Ansonsten erhält x das Ergebnis des Aufrufs von bar().

Somit ersetzt die Zeile den folgenden Codeblock:

let x = (foo !== null && foo !== undefined) ?
foo :
bar();

Außerdem bietet TypeScript 3.7 eine bessere Implementierung von Assertions und setzt dafür auf zwei Signaturen: Eine prüft, ob eine beliebige Bedingung true ergibt:

function assert(condition: any, msg?: string): asserts condition {
if (!condition) {
throw new AssertionError(msg)
}
}

und die andere prüft den Typ einer Variablen. Die Syntax ist an die der assert-Funktion von Node.js angelehnt.

Außerdem kann TypeScript nun Funktionen korrekt behandeln, die never zurückgeben, also den Programmfluss abbrechen. Der Typ selbst ist seit TypeScript 2.0 Bestandteil der Sprache. TypeScript erkennt nun den Einfluss auf den Programmfluss und behandelt die Funktionen entsprechend. Codebeispiele dazu und zu den Assertions finden sich in dem zugehörigen Pull Request auf GitHub.

Weitere Neuerungen in TypeScript 3.7 wie zusätzliche rekursive Type Aliases und die neuerdings erlaubte Kombination der Flags --declaration und --allowJs, die sich bisher gegenseitig ausgeschlossen haben, lassen sich dem TypeScript-Blog entnehmen. (rme)