Bulldogjob
Bulldogjob

TypeScript 5.3 - przegląd nowości

Sprawdź, jakie nowości i ulepszenia pojawiły się w TypeScript 5.3.
29.11.20233 min
TypeScript 5.3 - przegląd nowości

Microsoft opublikował TypeScript 5.3, najnowszą aktualizację swojej silnie typowanej wersji JavaScript. Sprawdzamy nowości i ulepszenia tego wydania.

Ewolucja i wsparcie atrybutów w imporcie ECMAScript

Jedną z kluczowych zmian tej wersji jest wsparcie dla atrybutów w imporcie ECMAScript. Atrybuty te działają jako łącznik pomiędzy różnymi środowiskami JavaScript, co ułatwia obsługę różnych typów modułów. Będzie to zapewne najbardziej przydatne w modułach JSON.

Atrybuty to ewolucja wcześniejszych asercji importu z TypeScript 4.5 i je zastępują. Nowa składnia to oczywiście nowe słowo kluczowe, ale teraz środowisko wykonawcze może użyć atrybutów w czasie importowania ścieżek importu. Natomiast asercje pozwalały na sprawdzenie właściwości po wczytaniu modułu.

// We only want this to be interpreted as JSON,
// not a runnable/malicious JavaScript file with a `.json` extension.
import obj from "./something.json" with { type: "json" };
// TypeScript is fine with this.
// But your browser? Probably not.
import * as foo from "./foo.js" with { type: "fluffy bunny" };
const obj = await import("./something.json", {
    with: { type: "json" }
});

To też pomaga w używaniu resolution-mode znanego z TypeScript 4.7. Natomiast w nowej wersji resolution-mode staje się stabilne i można go używać jako atrybut importu:

import type { TypeFromRequire } from "pkg" with {
    "resolution-mode": "require"
};

Zawężanie

W nowej wersji możliwe jest zawężanie typów w instrukcji switch (true). Używają takiej składni można zawężać typy w kolejnych klauzulach case. Po takim zabiegu TypeScript będzie rozumiał z jakim typem ma do czynienia i nie będzie krzyczeć, gdy wykorzystasz metody spodziewane w danym typie:

function f(x: unknown) {
    switch (true) {
        case typeof x === "string":
            // 'x' is a 'string' here
            console.log(x.toUpperCase());
            // falls through...

        case Array.isArray(x):
            // 'x' is a 'string | any[]' here.
            console.log(x.length);
            // falls through...

        default:
          // 'x' is 'unknown' here.
          // ...
    }
}

Podobnie jest też w miejscach, w których sprawdzamy w warunku czy coś to konkretnie true lub false. TypeScript 5.3 o wiele lepiej radzi sobie z zawężaniem typów na podstawie takich warunków.

Jak coś, to te funkcje zaczął rozwijać Polak - Mateusz Burzyński.

Dodatkowo jeżeli zdecydujesz się nadpisać zachowanie instanceOf, to teraz kompilator to uszanuje i prawidłowo zinterpretuje zawężanie typu w takim przypadku.

Większa kontrola, optymalizacje i sprzątanie

TypeScript 5.3 wprowadza bardziej rygorystyczną kontrolę dostępu do właściwości super w klasach z polami instancji. Kompilator teraz zgłosi błąd, gdy dostępna za pomocą super będziemy chcieli się dobrać do pola, a nie do metody.

Nowy TypeScript jest nieco bardziej wydajny, szczególnie jeżeli używasz JSDoc, bo teraz go nie będzie parsować. Nieco udało się też ugrać na sprawdzaniu nieznormalizowanych przecięć typów. W ramach usprawnień udało się też połączyć większość zawartości plików tsserverlibrary.js i typescript.js. Wcześniej duża część kodu była obecna zarówno w jednym i w drugim, teraz typescript.js zawiera to, co kiedyś było w tsserverlibrary.js.

Co dalej?

Kolejne wydanie, czyli TypeScript 5.4, ma być gotowe do lutego 2024. A do tej pory, pamiętaj, że TS jest projektem typu open source i też możesz dodawać swoje cegiełki do jego rozwoju. Tak jak zrobił to Mateusz.

<p>Loading...</p>