TypeScript 5.8 er ute – dette er nytt

Microsoft har lansert den endelige versjonen av TypeScript 5.8. TypeScript-ekspert Matt Pocock er spesielt fornøyd med én nyhet.

Versjon 5.8 av TypeScript er ute. 📸: Kurt Lekanger
Versjon 5.8 av TypeScript er ute. 📸: Kurt Lekanger Vis mer

Microsoft har lansert den endelige versjonen av TypeScript 5.8, skriver InfoWorld.

TypeScript 5.8 har vært i beta siden 29. januar. I den endelige versjonen har Microsoft valgt å droppe en ny funksjon som ble introdusert i betaen, som handlet om sjekking mot "conditional types" i return-statements. Planen er å lansere dette i versjon 5.9 i stedet.

Det er imidlertid en god del nytt i versjon 5.8 også.

TypeScript 5.8 is now out, with ✅ Better Checks on return expressions ✅ Support for require(esm) in --module nodenext ✅ --libReplacement to speed up program loading ✅ --erasableSyntaxOnly and more! Try it today! devblogs.microsoft.com/typescript/a...

[image or embed]

— TypeScript (@typescriptlang.org) February 28, 2025 at 8:44 PM

Bedre sjekk av return-expressions

En av nyhetene i TypeScript 5.8 er det Microsoft kaller "Granular Checks for Branches in Return Expressions" – som kan oversettes til noe sånt som "mer finmaskede sjekker for forgreninger i returutrykk" (?).

Hensikten er å fange opp flere mulige kilder til bugs. Det hele kan forklares best med et eksempel:

declare const untypedCache: Map<any, any>;

function getUrlObject(urlString: string): URL {
    return untypedCache.has(urlString) ?
        untypedCache.get(urlString) :
        urlString;
}

Poenget med denne kodesnutten er å hente et URL-objekt fra en cache hvis det eksisterer, eller lage et nytt URL-objekt hvis det ikke finnes fra før. Det er imidlertid en bug i koden: Vi konstruerer ikke et nytt URL-objekt med det vi har fått som input. "urlString" som kommer til slutt er altså av feil type, men det oppdager ikke TypeScript.

Fra og med versjon 5.8 av TypeScript, vil denne typen bugs fanges opp. Du kan lese flere detaljer om hvordan det hele fungerer her, men kort fortalt vil TypeScript 5.8 sjekke hver "gren" av betingelser i return-uttrykk mot den deklarerte returtypen (i dette tilfellet URL).

I versjon 5.8 får du nå en slik feilmelding:

declare const untypedCache: Map<any, any>;

function getUrlObject(urlString: string): URL {
    return untypedCache.has(urlString) ?
        untypedCache.get(urlString) :
        urlString;
    //  ~~~~~~~~~
    // error! Type 'string' is not assignable to type 'URL'.
}

ErasableSyntax

En annen nyhet i TypeScript 5.8 som mange utviklere nok vil ønske velkommen, er det nye flagget --erasableSyntaxOnly.

Kort fortalt vil dette flagget gjøre at det kun er lov å bruke TypeScript-funksjonalitet som kan strippes vekk fra koden, og der koden etter at TypeScript-spesifikk syntaks er fjernet fortsatt er en gyldig JavaScript-fil.

I praksis betyr det at blant annet enums ikke vil støttes:

// ❌ error: A namespace with runtime code.
namespace container {
    foo.method();

    export type Bar = string;
}

// ❌ error: An `import =` alias
import Bar = container.Bar;

class Point {
    // ❌ error: Parameter properties
    constructor(public x: number, public y: number) { }
}

// ❌ error: An enum declaration.
enum Direction {
    Up,
    Down,
    Left,
    Right,
}

Noe av bakgrunnen for at --erasableSyntaxOnly innføres er at Node.js nylig fikk støtte for å kjøre TypeScript-filer direkte. Kjøring av Node.js-filer med TypeScript fungerer imidlertid kun hvis man bruker TypeScript-syntaks som kan slettes fra koden.

– Den kobler ut en masse funksjonalitet som jeg mener aldri burde ha blitt en del av TypeScript, skrev nylig TypeScript-eksperten Matt Pocock.