TypeScript 5.6 lässt manchen Code nicht mehr zu

In der neuen Version der Programmiersprache hat sich einiges getan, was unter anderem den Umgang mit Truthy- und Nullish-Prüfungen betrifft.

In Pocket speichern vorlesen Druckansicht

(Bild: RossEdwardCairney/Shutterstock.com)

Lesezeit: 2 Min.

Die neue Programmiersprachenversion TypeScript 5.6 ist erschienen. Microsoft hat dem Superset von JavaScript einige neue Features spendiert, jedoch auch eine Änderung aus der Beta-Phase wieder rückgängig gemacht, die die Suche nach der tsconfig.json-Datei betrifft. Neu sind strengere Nullish- und Truthy-Checks, Iterator-Hilfsmethoden sowie strenge, integrierte Iterator-Checks.

Die Ende Juli erschienene Beta-Version führte eine Änderung in Bezug darauf ein, wie TypeScripts Language Service nach tsconfig.json-Dateien suchte. Der Language Service konnte die Suche nach jeder möglichen Projektdatei namens tsconfig.json fortführen, statt wie bisher bei der ersten zu stoppen. Das konnte allerdings zum Öffnen vieler referenzierter Projekte führen. Daher hat das Entwicklungsteam sich dazu entschieden, dieses Verhalten zunächst rückgängig zu machen und womöglich in veränderter Form in Version 5.7 wieder einzuführen.

TypeScript 5.6 führt als Änderung ein, mit strengeren Nullish- und Truthy-Checks bestimmte Ausdrücke nicht mehr zu erlauben. Wie das TypeScript-Team anhand einiger Beispiele ausführt, kann es sich zwar um syntaktisch validen JavaScript-Code handeln, der jedoch nicht das tut, was die Entwicklerin oder der Entwickler im Sinn hatten. TypeScript akzeptierte diese Fälle bisher, doch nun gibt der Compiler einen Fehler aus.

So ergeben sich nun diese Fehlermeldungen, wenn ein Ausdruck immer wahr oder niemals Null ist:

if (/0x[0-9a-f]/) {
//  ~~~~~~~~~~~~
// error: This kind of expression is always truthy.
}

if (x => 0) {
//  ~~~~~~
// error: This kind of expression is always truthy.
}

function isValid(value: string | number, options: any, strictness: "strict" | "loose") {
    if (strictness === "loose") {
        value = +value
    }
    return value < options.max ?? 100;
    //     ~~~~~~~~~~~~~~~~~~~
    // error: Right operand of ?? is unreachable because the left operand is never nullish.
}

if (
    isValid(primaryValue, "strict") || isValid(secondaryValue, "strict") ||
    isValid(primaryValue, "loose" || isValid(secondaryValue, "loose"))
) {
    //                    ~~~~~~~
    // error: This kind of expression is always truthy.
}

Wie das TypeScript-Team weiter ausführt, lassen sich ähnliche Ergebnisse mit der Regel no-constant-binary-expression im Codeanalyse-Tool ESLint erzielen. Jedoch handele es sich dabei um keine komplette Überlappung, sodass durch die TypeScript-Änderung ein Mehrwert entstehe.

Erlaubt bleiben bestimmte Ausdrücke mit true, false, 0 und 1, die auch immer truthy beziehungsweise nullish sind, wie in folgendem Beispiel:

while (true) {
    doStuff();

    if (something()) {
        break;
    }

    doOtherStuff();
}

Zu den weiteren hinzugefügten Sprachfeatures zählen ein neuer Typ namens IteratorObject und die neue Compiler-Option --noCheck zum Überspringen des Type Checking für alle Input-Dateien.

Der Iterationsplan für TypeScript 5.7 steht schon auf GitHub bereit, um priorisierte Features, Bugfixes und geplante Release-Termine nachzuverfolgen. Demnach soll die nächste Version am 21. November 2024 erscheinen.

Informationen zu allen weiteren Neuerungen im aktuellen Release finden sich in Microsofts TypeScript-Blog.

(mai)