Programmiersprache: TypeScript 4.4 erlaubt Symbole als Indexsignaturen

Neben der Erweiterung des Zugriffs auf Indexsignaturen verbessert die Programmiersprache die Kontrollflussanalyse zur Typenzuordnung.

In Pocket speichern vorlesen Druckansicht
Schreibmaschine, Tastatur, Keyboard, Digitalisierung

(Bild: Pixabay tsg1, gemeinfrei)

Lesezeit: 3 Min.
Von
  • Rainald Menge-Sonnentag
Inhaltsverzeichnis

Microsoft hat die erste Beta von TypeScript 4.4 veröffentlicht. Das Release bringt kleinere Anpassungen auf der Sprachebene und neue Optionen für das Verwenden des Typs unknown in Try-Catch-Blöcken und im Umgang mit optionalen Properties.

TypeScript nutzt von Haus aus Kontrollflussanalyse, um den exakten Typ von Variablen zu bestimmen. Über das sogenannte Type-Guard-Konzept stellt der Compiler bei folgendem Codebeispiel aus dem TypeScript-Blog fest, dass die Variable arg innerhalb des if-Blocks den Typ string haben muss.

function foo(arg: unknown) {
    if (typeof arg === "string") {
        // We know this is a string now.
        console.log(arg.toUpperCase());
    }
}

Bisher tauchte Type Guard jedoch nicht weiter in die Tiefe des Codes ein. Daher führte eine Typüberprüfung über eine Konstante bisher zu der Fehlermeldung: "Error! Property 'toUpperCase' does not exist on type 'unknown'", obwohl auch hier der Programmfluss das Innere des if-Blocks nur für ein arg vom Typ string erreicht:

function foo(arg: unknown) {
    const argIsString = typeof arg === "string";
    if (argIsString) {
        console.log(arg.toUpperCase());
    }
}

TypeScript 4.4 erweitert die Kontrollflussanalyse für Type Guard, womit das Konstrukt nun erlaubt ist. Die Analyse funktioniert gleichermaßen für const und readonly Properties sowie für nicht veränderte Parameter. Neben Überprüfungen über typeof funktioniert auch der Test der Zugehörigkeit zu einzelnen Union-Elementen.

Die zweite sprachliche Ergänzung betrifft den Zugriff auf Elemente über Indexsignaturen, um beispielsweise Map-ähnliche Strukturen über ein Interface abzubilden:

interface BooleanDictionary {
    [key: string]: boolean;
}

declare let myDict: BooleanDictionary;

// Valid to assign boolean values
myDict["foo"] = true;
myDict["bar"] = false;

Bisher war der Key-Typ für den Zugriff über Indexsignaturen auf string und number beschränkt. Version 4.4 der Programmiersprache erweitert das Spektrum um symbol-Keys:

interface Colors {
    [sym: symbol]: number;
}

const red = Symbol("red");
const green = Symbol("green");
const blue = Symbol("blue");

Ebenso lässt sich der Zugriff neuerdings nicht mehr nur über reine string-Elemente, sondern auch über String-Patterns wie `color-${string}` durchführen.

Daneben gibt es noch einige kleinere Neuerungen, die über Optionen zu aktivieren sind. So führt der Parameter --useUnknownInCatchVariables dazu, dass Variablen in Try-Catch-Blöcken standardmäßig nicht wie bisher vom Typ any, sondern als unknown deklariert sind. Das vor einem knappen Jahr veröffentlichte TypeScript 4.0 erlaubte bereits die explizite Angabe von any oder unknown für den catch-Block.

Beim Überprüfen des Codes mit dem Flag --strict gilt der neue Parameter automatisch als gesetzt, was zu Inkompatibilitäten führen kann.

Eine weitere 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. Für das beispielhafte Interface

interface Person {
    name: string,
    age?: number;
}

war bis TypeScript 4.3 eine explizite Zuweisung folgender Art zulässig:

const p: Person = {
    name: "Daniel",
    age: undefined,
};

Intern war die Property als age?: number | undefined; definiert. Die aktuelle Version der Programmiersprache reagiert dagegen mit einer Fehlermeldung, da nur number für die direkte Zuweisung erlaubt ist.

Weitere Neuerungen in TypeScript 4.4 wie die überarbeitete --help-Option lassen sich dem Entwicklungsblog bei Microsoft entnehmen. Die Betaphase von TypeScript 4.4 ist auf zwei Monate ausgelegt, und das endgültige Release soll laut Roadmap am 24. August erscheinen.

(rme)