TypeScript 3.9 bringt verbessertes Promise-Handling und neue Kommentar-Features


TypeScript basiert auf Vorschlägen zum ES6-Standard. Viele Konzepte der Sprache wie Klassen, Vererbung oder Module sind daher deckungsgleich mit ES6. Syntax und Semantik der Sprache sind stark an JavaScript angelehnt. Die Lernkurve ist für Entwickler, die von JavaScript zu TypeScript wechseln, relativ moderat.
Nix mehr verpassen: Die t3n Newsletter zu deinen Lieblingsthemen! Jetzt anmelden
Wer mit TypeScript arbeitet, kann dabei bereits existenten JavaScript-Code und die meisten Frameworks und Libraries aus dem JavaScript-Ökosystem nutzen. TypeScript-Code kann über JavaScript aufgerufen werden. Am Ende wird TypeScript zu JavaScript-Code kompiliert, der in allen Browsern, in Node.js und in jeder JavaScript-Engine läuft, die ECMAScript ab Version 3 unterstützt. Version 3.9 ist jetzt als Beta-Release verfügbar. Die meisten Neuerungen zielen auf Performanz und Stabilität sowie eine verbesserte Dev-Experience ab, viele Bug-Fixes und Vorschläge kommen dieses Mal aus der Community.
Anzeige Verbesserter Inferenzprozess und Promise.all
In TypeScript 3.7 und später wurden Funktionsaufrufe wie Promise.all und Promise.race aktualisiert. Damit gingen allerdings einige Überraschungen einher, vor allem, wenn Values mit null oder undefined im Spiel waren.
interface Lion
roar(): void
interface Seal
singKissFromARose(): void
async function visitZoo(lionExhibit: Promise, sealExhibit: Promise)
let [lion, seal] = await Promise.all([lionExhibit, sealExhibit]);
lion.roar(); // uh oh
// ~~~~
// Object is possibly 'undefined'.
*alle Code-Beispiele wurden aus dem offiziellen Blogpost zum Release übernommen.
Dass SealExhibit ein undefined enthält, geht im Beispiel komischerweise auf Lion über und ihr bekommt die Fehlermeldung Object is possibly undefined. Dieses unerwünschte Verhalten wurde in V 3.9 dank eines Pull-Requests von Jack Bates elimiert, sodass der oben stehende Code jetzt keine Fehler mehr wirft. Wer aufgrund derartiger Probleme mit Promises bei Versionen älter 3.7 geblieben ist, kann mit V 3.9 jetzt auch endlich upgraden.
Verbesserte Performanz
TypeScript 3.9 bringt einige Performanz-Upgrades. In vorherigen Versionen gab es diesbezüglich wohl Probleme im Zusammenhang mit Packages wie zum Beispiel material-ui oder styled-components. Über Pull-Requests konnten laut dem offiziellen Blogpost zum Release Probleme mit großen unions, Intersections, conditionals und mapped-Typen behoben werden und so pro Pull-Request eine Reduzierung der Kompilierzeit von fünf bis zehn Prozent erreicht werden. Material-UIs Compile-Time zum Beispiel ist damit in V 3.9 um etwa 40 Prozent reduziert.
Auch was den Editor angeht, kommt TS mit einigen Performanz-Verbesserungen. Beim Umbenennen einer Datei konnte es wohl bei der Arbeit mit bisherigen TS-Versionen passieren, dass VS Code bis zu zehn Sekunden dafür brauchte, herauszufinden, welche import-Statements aktualisiert werden müssen. In V 3.9 wurde geändert, wie Datei-Lookups von Compiler und Language-Services gecached werden, was zu einer Verbesserung der Dev-Experience für TypeScript-Entwickler und -Entwicklerinnen führen sollte.
// @ts-expect-error-Kommentare
TypeScript 3.9 bringt ein neues Feature namens @ts-expect-error-Kommentare. Nützlich ist das zum Beispiel, wenn ihr eine Library in TypeScript schreibt. Als Teil eures öffentlichen API exportiert ihr eine Funktion namens doStuff. Um Type-Checking-Errors für TypeScript-Entwicklerinnen zu ermöglichen, akzeptiert die Funktion zwei Strings als Parameter. Außerdem wird ein Laufzeitcheck durchgeführt, um auch JS-Entwicklern eine hilfreiche Fehlermeldung bieten zu können.
function doStuff(abc: string, xyz: string)
assert(typeof abc === "string");
assert(typeof xyz === "string");
// do some stuff
Bei falscher Verwendung dieser Funktion bekommen TypeScript-User also ein hilfreiches kleines rotes Rechteck und JS-Nutzer einen Assertion Error. Um dieses Verhalten zu testen, schreibt ihr einen Unit-Test:
expect(() =>
doStuff(123, 456);
).toThrow();
Schreibt ihr den Unit-Test jedoch in TypeScript, bekommt ihr folgende Fehlermeldung:
doStuff(123, 456);
// ~~~
// error: Type 'number' is not assignable to type 'string'.
Der @ts-expect-error-Kommentar wurde in TypeScript 3.9 eingeführt, um genau das zu vermeiden. Den Kommentar könnt ihr einer Zeile voranstellen. Das bewirkt, dass ein TS-Error unterdrückt, das heißt, nicht angezeigt wird, falls es andernfalls einen gegeben hätte. Wenn nicht, führt das neue Feature dazu, dass TypeScript euch sagt, dass sein Einsatz nicht nötig gewesen wäre.
Um das zu veranschaulichen: Dieser Code wird ohne Fehlermeldung ausgeführt,
// @ts-expect-error
console.log(47 * "octopus");
während folgender Code:
// @ts-expect-error
console.log(1 + 1);
zu dieser Fehlermeldung führt:
Unused '@ts-expect-error' directive.
Alle Details dazu könnt ihr im zugehörigen Pull-Request nachlesen.
Wer sich jetzt fragt, wie sich @ts-ignore und @ts-expect-error unterscheiden: Der Unterschied ist, dass @ts-ignore Kommentare nichts tun, wenn die betreffende Zeile korrekt ist. Welchen ihr nutzt, ist abhängig von einigen Faktoren, eine Entscheidungshilfe findet ihr im offiziellen Blogpost zum Release.
Jetzt auch für Ternary Conditionals: Uncalled Function Checks
In TypeScript 3.7 wurde mit uncalled Function Checks ein Feature eingeführt, das dazu führt, dass ihr eine Fehlermeldung bekommt, wenn ihr den Funktionsaufruf vergessen habt.
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();
https://samplecic.ch/typescript-3-9-bringt-verbessertes-promise-handling-und-neue-kommentar-features.html
Комментарии
Отправить комментарий