TypeScript 3.7: Die ??? und der übersichtlichere Code
Das aktuelle Release der Skriptsprache führt den Nullish-Coalescing-Operator und das Optional Chaining ein.
- Rainald Menge-Sonnentag
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.
Ein Fragezeichen zum Verketten
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.
Zwei Fragezeichen für die Null
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();
Zusicherung und Funktionen ohne Rückkehr
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)