Programmiersprache: TypeScript 3.9 verbessert Promises und erwartet Fehler

Ein neuer Kommentar blendet Fehler aus und Promise.all funktioniert auch mit undefinierten Werten, aber auf awaited müssen Entwickler weiter warten.

In Pocket speichern vorlesen Druckansicht 3 Kommentare lesen
Programmiersprache: TypScript 3.9 verbessert Versprechen und erwartete Fehler
Lesezeit: 4 Min.
Von
  • Rainald Menge-Sonnentag
Inhaltsverzeichnis

Microsoft hat turnusmäßig die Beta von TypeScript 3.9 herausgegeben. Die auf JavaScript aufsetzende Programmiersprache führt unter anderem einen neuen Kommentar zum Unterdrücken von Fehlermeldungen ein und verbessert den Einsatz von Promise.all. Außerdem lassen sich Tests auf undefinierte Funktionen nun auch mit dem bedingten Operator durchführen.

Ein Schwerpunkt auf dem Weg zum aktuellen Release liegt auf der Performance: Pakete wie material-ui und styled-components profitieren wohl besonders, bei ersterem soll in TypeScript 3.9 die Zeit zum Kompilieren um 40 Prozent geringer ausfallen als bei den Vorgängerversionen. Für die Arbeit mit Visual Studio Code hat das Team das Überprüfen betroffener import-Anweisungen optimiert.

Der neue Kommentar // @ts-expect-error unterdrückt TypeScript-Fehlermeldungen, die Entwickler explizit erwarten. Sinnvoll ist er unter anderem für Unit-Tests, die bestimmte Fehler unabhängig vom TypeScript-Compiler aufspüren sollen. Ein weiterer Einsatzbereich sind Methoden beispielsweise in Libraries, die mit dem aktuellen Code nicht kompatibel sind, sich aber bis zum Release ändern sollen.

Auf den ersten Blick wirkt der neue Kommentar wie eine Doublette des vorhandenen // @ts-ignore, der ebenfalls Fehlermeldungen unterdrückt. Der entscheidende Unterschied ist, dass ts-expect-error einen Fehler auslöst, wenn er überflüssig ist wie in folgendem Codeausschnit:

// @ts-expect-error
console.log(1 + 1);

In gewisser Weise steht man hier vor dem Paradoxon, dass ein TypeScript-Fehler auftritt, wenn kein Fehler auftreten kann. // @ts-ignore verhält sich dagegen wahrlich ignorant und erzeugt niemals einen Fehler für die nächste Zeile.

Seit dem Release von TypeScript 3.7 hat die Programmiersprache einige Updates zu Methoden wie Promise.all (iterable) erhalten, das dafür dient, eine Reihe zu erfüllender Voraussetzungen in asynchronem Code zu verbinden. Es gilt als erfüllt (fullfilled), wenn alle Versprechen im Iterable-Objekt erfüllt sind, und als abgelehnt (rejected), sobald das erste darin abgelehnt wird.

Die Neuerungen der letzten beiden Releases führten wohl zu einigen Regressionen, wenn undefinierte Werte Bestandteil der Objekte im Iterable sind, auch wenn sie den eigentlichen Programmverlauf nicht beeinflussen. TypeScript 3.9 verarbeitet diese Promises nun korrekt.

Nach wie vor fehlt jedoch der Operator awaited, der für das aktuelle Release geplant war und das Unwrapping von Promise analog zu await in JavaScript erledigen soll. Offensichtlich ist die Integration komplexer als ursprünglich erwartet, sodass Entwickler noch eine Weile auf awaited warten müssen.

Seit Version 3.7 findet die Programmiersprache vermeintliche Funktionsaufrufe, die keine sind, wie in folgendem Beispiel aus dem TypeScript-Blog:

function hasImportantPermissions(): boolean {
// ...
}

// Oops!
if (hasImportantPermissions) {
// ~~~~~~~~~~~~~~~~~~~~~~~
// This condition will always return true since the function
// is always defined.
// Did you mean to call it instead?
deleteAllTheImportantFiles();
}

Der Code testet lediglich, ob die Funktion hasImportantPermissions definiert ist, was immer true ergibt. Sinnvoll wäre jedoch, sie aufzurufen und die darin enthaltenen Überprüfungen durchzuführen, bevor der weitere Code mal eben alle wichtigen Dateien löscht.

Bisher testete TypeScript nur explizite if-Bedingungen, aber mit TypeScript 3.9 findet die Überprüfung auch beim bedingten beziehungsweise ternären Operator statt, sie würde also im Beispiel auch für hasImportantPermissions ? ... anschlagen.

Weitere Neuerungen in TypeScript 3.9, darunter die Verbesserung bei der Integration in Sourcecode-Editoren beziehungsweise IDEs wie Visual Studio Code, Sublime Text 3 und Visual Studio 2017/2019 lassen sich dem TypeScript-Blog entnehmen. Wer die Beta testen möchte, kann sie von NuGet herunterladen oder über npm mit dem Befehl npm install typescript@beta installieren. Das endgültige Release von TypeScript 3.9 ist für den 12. Mai vorgesehen. (rme)