TypeScript в 2025 году: что нового и как это изменит вашу разработку
Мир frontend-разработки не стоит на месте, и TypeScript продолжает укреплять свои позиции как основной инструмент для создания масштабируемых и надежных приложений. В 2025 году язык получил ряд значительных обновлений, которые затрагивают как систему типов, так и производительность самого компилятора. В этой статье мы разберем ключевые нововведения, которые уже доступны или ожидаются в ближайших релизах.
Если вы пишете на TypeScript или только начинаете изучать этот язык, понимание новых возможностей поможет вам писать более чистый, безопасный и быстрый код. Мы рассмотрим четыре главных направления: эволюцию системы типов, новый компилятор, долгожданные декораторы v2 и улучшенную работу с асинхронностью.
1. Эволюция системы типов: условные типы и улучшенный вывод
В 2025 году система типов TypeScript стала еще более выразительной. Разработчики получили возможность более точно описывать сложные зависимости между типами.
Улучшенные условные типы (Conditional Types):
Теперь условные типы могут работать с infer в более широком контексте, что позволяет извлекать типы из сложных вложенных структур без лишнего дублирования кода.
// Пример: извлечение типа ответа из Promise
type UnwrapPromise<T> = T extends Promise<infer U> ? U : T;
type Result = UnwrapPromise<Promise<string[]>>;
// Result = string[]
Типы-шаблоны (Template Literal Types) с рекурсией:
Новый синтаксис позволяет создавать рекурсивные шаблонные типы для разбора строковых литералов. Это особенно полезно для работы с API и маршрутизацией.
// Разбор строки вида "user:123:admin"
type ParseUser<S extends string> =
S extends `${infer Name}:${infer Id}:${infer Role}`
? { name: Name; id: Id; role: Role }
: never;
type User = ParseUser<'alice:456:editor'>;
// User = { name: "alice"; id: "456"; role: "editor" }
Автоматический вывод типов для деструктуризации массивов:
Компилятор теперь лучше понимает кортежи при деструктуризации, что уменьшает необходимость явно указывать типы.
function getData(): [string, number, boolean] {
return ['hello', 42, true];
}
// Раньше пришлось бы писать const [a, b, c]: [string, number, boolean] = getData();
const [a, b, c] = getData();
// a: string, b: number, c: boolean — выведено автоматически
2. Новый компилятор на Rust: скорость и производительность
Одним из самых громких анонсов 2025 года стал новый компилятор TypeScript, переписанный на Rust. Это не замена существующему транспилятору, а дополнительный инструмент, который значительно ускоряет проверку типов в больших проектах.
Ключевые особенности:
- Скорость: Проверка типов в проектах с миллионами строк кода выполняется в 5-10 раз быстрее.
- Инкрементальная компиляция: При изменении одного файла перепроверяются только зависимые модули, а не весь проект.
- LSP-сервер: Новая реализация Language Server Protocol на Rust обеспечивает мгновенные подсказки и автодополнение в IDE.
- Совместимость: Полностью поддерживает существующие
tsconfig.jsonи код, написанный на TypeScript 5.x.
# Установка нового компилятора
npm install -g typescript-rs
# Запуск проверки типов (аналог tsc --noEmit)
tsc-rs --check
# Запуск в watch-режиме
tsc-rs --watch
Когда использовать? Для небольших проектов (до 10 000 строк) разница может быть незаметна, но для enterprise-приложений и монорепозиториев новый компилятор станет спасением.
3. Декораторы v2: стабильный стандарт и новые возможности
После долгих лет экспериментов и черновиков, декораторы версии 2 наконец-то стали стабильной частью языка. Они основаны на предложении TC39 для JavaScript и теперь поддерживаются на уровне компилятора без необходимости включать экспериментальные флаги.
Что изменилось:
- Новый синтаксис: Декораторы теперь принимают контекстный объект, что делает их более гибкими.
- Поддержка всех целей: Декорировать можно классы, методы, геттеры/сеттеры, свойства и параметры.
- Совместимость с ES: Декораторы v2 полностью совместимы с будущим стандартом JavaScript.
// Декоратор для логирования вызова метода
function log(target: Function, context: ClassMethodDecoratorContext) {
const methodName = String(context.name);
return function(this: any, ...args: any[]) {
console.log(`Вызов ${methodName} с аргументами:`, args);
const result = target.call(this, ...args);
console.log(`Результат ${methodName}:`, result);
return result;
};
}
class Calculator {
@log
add(a: number, b: number): number {
return a + b;
}
}
const calc = new Calculator();
calc.add(2, 3);
// Вывод: Вызов add с аргументами: [2, 3]
// Вывод: Результат add: 5
Миграция с v1: Если вы использовали экспериментальные декораторы из experimentalDecorators: true, придется адаптировать код. Большинство популярных библиотек (NestJS, TypeORM) уже выпустили обновления для поддержки v2.
4. Улучшенная работа с асинхронностью и итераторами
TypeScript 6.0 (условное обозначение версии 2025 года) привнес улучшения в работу с асинхронными итераторами и генераторами.
Async Generator Types:
Теперь можно точно типизировать асинхронные генераторы, указывая типы возвращаемых значений и исключений.
// Асинхронный генератор с типизацией
async function* fetchPages(urls: string[]): AsyncGenerator