Ответ
TypeScript 5.5 принес несколько важных улучшений:
- Уточнение типа
inferredв условных типах
Теперь можно явно указыватьinferс ограничениями:
type FirstIfString<T> =
T extends [infer S extends string, ...unknown[]] ? S : never;
- Улучшенная проверка типов для регулярных выражений
Более точные типы дляRegExpгрупп захвата:
const match = /(?<year>d{4})/.exec("2024");
const year = match?.groups?.year; // string | undefined
- Поддержка
constпараметров типа
Позволяет сохранять точные литеральные типы:
function makeArray<const T>(x: T): [T, T] {
return [x, x];
}
const result = makeArray("hello"); // ["hello", "hello"]
-
Улучшения производительности
До 20% ускорение в некоторых сценариях, особенно с большими проектами. -
Новые флаги компилятора
--moduleResolution bundlerдля лучшей совместимости с современными сборщиками.
Эти изменения улучшают вывод типов, производительность и работу с современным JS.
Ответ 18+ 🔞
А, ну вот, опять эти ребята из TypeScript накропали обнову. Сидят там, блядь, не спят ночами, думают, как бы нам, разработчикам, мозги ещё сильнее выебать своими типами. Ну ладно, посмотрим, что за хуйню они в этот раз принесли.
Первое, о чём кричат — уточнение inferred в условных типах. Раньше, сука, вытащить что-то из типа и сразу на него ограничение навесить было как козе баян — нихуя не понятно. А теперь можно прямо в infer написать extends. Смотри, как красиво стало:
type FirstIfString<T> =
T extends [infer S extends string, ...unknown[]] ? S : never;
То есть, ёпта, если первый элемент массива — строка, то мы её и получаем. А если нет — нахуй, never. Чисто, элегантно, мозг не вытекает. Раньше бы пришлось в два этапа это городить, а теперь — раз, и в дамки.
Дальше — регулярки. О, это моя любимая боль, блядь. Вечно эти группы захвата были как тёмный лес: string | undefined, и хуй пойми, что там на самом деле. А теперь, сука, TypeScript 5.5 глядит на твой паттерн и говорит: «Ага, дружок, я вижу, ты назвал группу year. Ну окей, в объекте groups будет поле year, и оно точно string | undefined, а не просто any». Ну, прогресс, ёбта.
const match = /(?<year>d{4})/.exec("2024");
const year = match?.groups?.year; // string | undefined
Не то чтобы овердохуища, но приятно. Хули, хоть какая-то определённость в этом царстве хаоса.
А вот это — вообще огонь, блядь. const параметры типа. Слушай, раньше ты передашь в дженерик функцию строку, а она тебе её обратно как string широкий отдаёт. А ты хотел литерал, конкретный, чтоб "hello", а не просто string. Так вот, теперь можно на параметр типа нацепить const, и он будет вести себя как константный контекст, ёпта. То есть сохранит точное значение.
function makeArray<const T>(x: T): [T, T] {
return [x, x];
}
const result = makeArray("hello"); // тип: ["hello", "hello"], а не [string, string]
Вот это реально полезная хуйня. Для всяких utility-типов, для иммутабельных состояний — просто пиздец как удобно. Наконец-то додумались, ядрёна вошь.
Ну и куда же без производительности. Обещают до 20% ускорения в больших проектах. Ну, бля, всегда они это обещают. Проверим на деле. Но если правда — то просто красота, можно будет меньше кофе пить, пока проект компилируется.
И, конечно, новые флаги. --moduleResolution bundler — это для всех, кто сидит на Vite, Webpack, Parcel и прочей современной хуйне. Чтоб лучше с их алгортимами резолва модулей дружил. Не то чтобы от этого счастье наступило, но геморроя точно меньше станет.
Короче, выкатывай, пробуй. Вроде ничего сломающего, одни улучшения. TypeScript потихоньку становится всё менее ебаным костылём и всё более... ну, нормальным языком, что ли. Хотя, кто его знает, эти ребята ещё такую хуйню могут придумать в следующем патче, что мы все опять обосрёмся.