Programmiersprache: TypeScript 4.4 erlaubt Symbole als Indexsignaturen
Neben der Erweiterung des Zugriffs auf Indexsignaturen verbessert die Programmiersprache die Kontrollflussanalyse zur Typenzuordnung.
(Bild: Pixabay tsg1, gemeinfrei)
- Rainald Menge-Sonnentag
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.
Typsicherung im Fluss
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.
Symbole auf dem Index
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.
Unbekannt statt irgendetwas
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)