Programmiersprache TypeScript 4.8 verbessert die Konsistenz bei Null-Prüfungen

Neben verfeinerten Typprüfungen im Zusammenspiel mit null und undefined bringt die Beta von Microsofts Programmiersprache Optimierungen beim Build-Prozess.

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

(Bild: Laszlo Zakarias, gemeinfrei)

Lesezeit: 2 Min.
Von
  • Rainald Menge-Sonnentag

Microsoft hat die erste Beta von TypeScript 4.8 veröffentlicht. Das Release des JavaScript-Superset konzentriert sich auf Änderungen unter der Haube. Einige Typprüfungen für Null-Checks sind nun konsistenter, und die Sprache ist strenger im Umgang mit Unconstrained Generics.

Außerdem bringt das Release einige Optimierungen für das Kompilieren über tsc mit den Kommandozeilenparametern --build, --watch und --incremental. Unter anderem verwendet der Compiler vorhandene Informationen wieder und aktualisiert im Watch-Modus keine Timestamps für unveränderte Bereiche. Eine Seite auf GitHub zeigt einige Benchmarks unter anderem auf der Codebase von TypeScript.

Einige Änderungen beziehen sich auf die strengen Null-Prüfungen für Projekte mit strictNullChecks. Eine Vereinfachung betrifft den in Version 3.0 eingeführten Typ unknown, der eine typsichere Alternative zu any ist. Bisher ließ er sich ohne Typüberprüfung keiner Variable eines anderen Typs zuweisen, während umgekehrt jeder Typ auf eine als unknown deklarierte Variable zuweisbar ist. Neuerdings ist jedoch die Zuweisung an eine Variable vom Union Type {} | null | undefined erlaubt, da dieser wie unkonwn, null, undefined und jeden anderen beliebigen Objekttyp aufnimmt.

Für die Kontrollflussanalyse von TypeScript verhält sich der unknown-Typ nun auch wie der obige Union Type. Damit ändert sich die Typprüfung mit if(x), wie folgendes Beispiel aus dem TypeScript-Blog zeigt:

function narrowUnknownishUnion(x: {} | null | undefined) {
    if (x) {
        x;  // {}
    }
    else {
        x;  // {} | null | undefined
    }
}

function narrowUnknown(x: unknown) {
    if (x) {
        x;  // war bisher 'unknown' und ist jetzt '{}'
    }
    else {
        x;  // unknown
    }
}

Darüber hinaus vereinfacht die aktuelle Version die Definition von NonNullable-Generics, die jetzt schlicht eine Intersection aus dem Zieltyp und {} sind: type NonNullable<T> = T & {};.

Eine weitere Prüfung zielt auf Unconstrained Generics, die konsequenterweise neuerdings in Projekten mit strictNullChecks nicht mehr an Funktionen übergeben werden dürfen, die Non-Nullable-Werte erwarten.

Eine kleine Änderung betrifft den Vergleich von Objekten mit Array-Literalen. JavaScript kennt dabei keine Gleichheitsprüfung der Inhalte, sondern überprüft, ob die Referenz tatsächlich auf die selbe Instanz verweist. Während in Python eine Abfrage in der Form if mein_array == [] prüft, ob ein Array leer ist, schlägt der Vergleich in JavaScript und damit auch TypeScript zur Laufzeit immer fehl. Daher verbietet TypeScript ab dem aktuellen Release Code folgender Art:

let mein_array = [];

if (mein_array === []) 
{
  //unnerreichbarer Code, da der Vergleich stets false ergibt
}

Weitere Neuerungen in TypeScript 4.8 wie die verbesserte Inferenz für infer-Typen in Template String Types lassen sich dem TypeScript-Blog entnehmen. Anfang August soll der erste Release Candidate erscheinen und das endgültige Release steht für den 23. August auf dem Plan.

(rme)