TypeScript 5.3 - przegląd nowości
Sprawdź, jakie nowości i ulepszenia pojawiły się w TypeScript 5.3.
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.