Programmiersprache: TypeScript 4.4 erweitert sein Typverständnis
Eine tiefere Kontrollflussanalyse erkennt Typdeklarationen auch außerhalb des aktuellen Blocks.
- Rainald Menge-Sonnentag
Gut sechs Wochen nach der ersten Beta ist planmäßig das offizielle Release von TypeScript 4.4 erschienen. Zu den nennenswerten Neuerungen gehört eine erweiterte Kontrollflussanalyse beim Bestimmen von Typen und die Möglichkeit, Symbole als Indexsignaturen zu verwenden. Außerdem gibt es optional zu aktivierende Anpassungen für Try-Catch-Blöcke.
Typen außerhalb des Blocks
TypeScript nutzt Kontrollflussanalyse, um den Typ von Variablen zu bestimmen. Über das sogenannte Type-Guard-Konzept weiß der Compiler innerhalb eines über if (typeof arg === "string"){
eröffneten Blocks, dass die Variable arg
vom Typ string
sein muss.
Allerdings hatte Type Guard bisher einen begrenzten Horizont und tauchte nicht in die Tiefen des Codes ein. Daher erkannte er beispielsweise nicht den außerhalb des aktuellen Blocks festgelegten Typ wie in folgendem Beispiel aus dem TypeScript-Blog:
function foo(arg: unknown) {
const argIsString = typeof arg === "string";
if (argIsString) {
console.log(arg.toUpperCase());
}
}
Obwohl hier arg
im Inneren des if
-Blocks ebenfalls vom Typ string
sein muss, reagiert der Compiler mit der Fehlermeldung "Error! Property 'toUpperCase' does not exist on type 'unknown'". Grund dafür ist, dass die eigentliche Typüberprüfung durch die Zuweisung an die Konstante außerhalb des if
-Blocks erfolgt.
TypeScript 4.4 erweitert die Kontrollflussanalyse für Type Guard, womit der Compiler den Code nun ohne Fehlermeldung übersetzt. Die Analyse funktioniert sowohl für const
und readonly
Properties als auch für nicht veränderte Parameter. Neben Überprüfungen über typeof
funktioniert auch der Test der Zugehörigkeit zu einzelnen Union-Elementen.
Symbole statt Zahlen
Die zweite größere Neuerung in der Programmiersprache betrifft die Indexsignaturen, um unter anderem Map
-ähnliche Strukturen abzubilden. Bisher erfolgte der Zugriff entweder über Zeichenketten als Schlüssel oder Zahlen als Indexwerte mit [key: string]
beziehungsweise [index: number]
.
TypeScript 4.4 erlaubt nun zusätzlich den Zugriff über Symbol
-Schlüssel:
interface Colors {
[sym: symbol]: number;
}
const red = Symbol("red");
const green = Symbol("green");
const blue = Symbol("blue");
Darüber hinaus sind für die Zeichenkette als Schlüssel neuerdings neben regulären string
-Elementen zusätzlich String-Patterns wie `color-${string}`
erlaubt.
Statische Blöcke
TypeScript 4.4 führt static
-Blöcke in Klassen ein und greift dabei einen geplanten ECMAScript-Standard auf. Das Vorgehen ermöglicht zusätzliche Initialisierungen für statische Klassen-Members, wie in vollem Beispiel aus dem TypeScript-Blog:
class Foo {
static #count = 0;
get count() {
return Foo.#count;
}
static {
try {
const lastInstances = loadLastInstances();
Foo.#count += lastInstances.length;
}
catch {}
}
}
Die Blöcke haben Zugriff auf die privaten Felder der jeweiligen Klasse. Wenn Klassen mehrere statische Blöcke haben, erfolgt die Abarbeitung in der Reihenfolge, in der sie im Sourcecode stehen.
Standardmäßig unbekannt
Zwei Neuerungen sind zunächst optional. Eine davon betrifft Variablen in Try-Catch-Blöcken, die bisher standardmäßig bei der Verarbeitung in catch
vom Typ any
sind. Sie haben neuerdings per Default den Typ unknown
, wenn der Parameter --useUnknownInCatchVariables
aktiviert ist. Das vor einem knappen Jahr veröffentlichte TypeScript 4.0 erlaubte bereits die explizite Angabe von any
oder unknown
für den catch
-Block.
Die zweite manuell zu aktivierende Anpassung betrifft optionale Properties: Der Parameter --exactOptionalPropertyTypes
sorgt dafür, dass der Compiler nur den explizit spezifizierten Typ zulässt und nicht wie bisher alternativ undefined
.
Weitere Neuerungen in TypeScript 4.4 wie die überarbeitete --help
-Option lassen sich dem Entwicklungsblog bei Microsoft entnehmen. Das Release steht über NuGet zur Verfügung oder lässt sich mit npm install typescript
installieren. Kurz vor der Veröffentlichung der neuen TypeScript-Version hat das Team die Website für die Programmiersprache komplett überarbeitet.
(rme)