Programmiersprache: TypeScript 4.4 erweitert sein Typverständnis

Eine tiefere Kontrollflussanalyse erkennt Typdeklarationen auch außerhalb des aktuellen Blocks.

Lesezeit: 3 Min.
In Pocket speichern
vorlesen Druckansicht Kommentare lesen 3 Beiträge
Schreibmaschine, Tastatur, Keyboard, Digitalisierung

(Bild: Pixabay tsg1, gemeinfrei)

Von
  • 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.

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.

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.

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.

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)