TypeScript в 2025 году: что нового?
2025 год стал знаковым для экосистемы TypeScript. После выхода версий 5.5 и 5.6, а также анонсов, касающихся будущих релизов, язык получил ряд важных улучшений, которые делают разработку еще более безопасной, производительной и удобной. В этой статье мы разберем ключевые нововведения TypeScript в 2025 году, которые должен знать каждый разработчик, работающий с этим языком.
1. Изолированные объявления (Isolated Declarations)
Одним из самых значимых нововведений 2025 года стала стабилизация функции изолированных объявлений (isolated declarations). Эта фича, впервые появившаяся в TypeScript 5.5, кардинально меняет подход к генерации файлов деклараций (.d.ts).
Раньше компилятору TypeScript для генерации .d.ts файлов требовалось анализировать весь граф зависимостей модуля. Это было медленно и сложно для современных инструментов сборки (например, esbuild, swc), которые работают с каждым файлом изолированно.
Фича isolatedDeclarations заставляет разработчика явно указывать типы для экспортируемых функций, переменных и классов. Благодаря этому инструменты могут генерировать декларации без полного анализа кода, что значительно ускоряет сборку.
Как это работает?
Включите опцию в tsconfig.json:
{
"compilerOptions": {
"isolatedDeclarations": true,
"declaration": true
}
}
Теперь при написании кода вы обязаны явно аннотировать типы экспортируемых сущностей:
// ❌ Ошибка: экспортируемая переменная не имеет явного типа
export const data = fetchData();
// ✅ Правильно
export const data: DataType = fetchData();
// ❌ Ошибка: нет аннотации типа для параметра
export function process(input) { ... }
// ✅ Правильно
export function process(input: InputType): OutputType { ... }
Почему это важно? Это не только ускоряет сборку, но и делает код более документированным и понятным. Разработчики больше не могут полагаться на неявный вывод типов для публичного API, что повышает надежность кода.
2. Улучшенный контроль потока для деструктуризации
TypeScript 5.6 принес долгожданное улучшение в систему контроля потока (control flow analysis) для деструктуризации объектов. Раньше TypeScript "терял" информацию о типе при деструктуризации, что приводило к необходимости писать избыточные проверки.
Рассмотрим пример:
type User = {
name: string;
email?: string;
role: "admin" | "user";
};
function greet(user: User) {
const { name, email, role } = user;
// В TypeScript 5.5 и ранее: ошибка! Object is possibly 'undefined'
// В TypeScript 5.6 и новее: все корректно
if (email) {
console.log(`Email: ${email.toUpperCase()}`);
}
// Умное сужение типа для дискриминирующего объединения
if (role === "admin") {
console.log(`Admin ${name} logged in`);
}
}
Теперь TypeScript сохраняет связь между деструктурированной переменной и исходным объектом. Это особенно полезно при работе с дискриминирующими объединениями (discriminated unions) и необязательными полями.
3. Новые синтаксические возможности и декораторы
2025 год также ознаменовался полной стабилизацией декораторов (декораторы из Stage 3 стали частью стандарта ECMAScript). TypeScript полностью поддерживает новый синтаксис декораторов, который отличается от старого экспериментального.
Пример использования нового декоратора:
// Новый синтаксис декоратора класса
function logMethod<T, A extends any[], R>(
target: (this: T, ...args: A) => R,
context: ClassMethodDecoratorContext
) {
return function (this: T, ...args: A): R {
console.log(`Calling ${String(context.name)} with args:`, args);
return target.call(this, ...args);
};
}
class Calculator {
@logMethod
add(a: number, b: number): number {
return a + b;
}
}
const calc = new Calculator();
calc.add(2, 3); // Вывод: Calling add with args: [2, 3]
Новые декораторы более типобезопасны и лучше интегрируются с системой типов TypeScript. Они поддерживают декорирование методов, свойств, аксессоров и самих классов.
4. Улучшенная поддержка типов для Promises и async/await
В TypeScript 5.6 была улучшена обработка типов для асинхронных операций. Теперь компилятор лучше понимает, когда Promise может быть разрешен, а когда нет, и генерирует более точные сообщения об ошибках.
Особенно полезным стало улучшение для работы с Promise.all и Promise.allSettled:
async function fetchMultipleData() {
const [user, posts] = await Promise.all([
fetchUser(), // Promise<User>
fetchPosts() // Promise<Post[]>
]);
// Раньше TypeScript мог "забыть" типы
// Теперь user строго типизирован как User, posts как Post[]
console.log(user.name, posts.length);
}
Кроме того, улучшилась типизация для async генераторов:
async function* generateNumbers(): AsyncGenerator<number> {
for (let i = 0; i < 10; i++) {
await new Promise(resolve => setTimeout(resolve, 100));
yield i;
}
}
// TypeScript теперь корректно выводит типы для for await...of
for await (const num of generateNumbers()) {
console.log(num); // num имеет тип number
}
5. Экспериментальные фичи: что нас ждет дальше?
Несмотря на то, что основные нововведения 2025 года уже стабилизированы, команда TypeScript активно работает над будущими возможностями. Среди наиболее обсуждаемых:
- Better Type Erasure — улучшенное стирание типов для уменьшения размера бандла.
- Pattern Matching — долгожданная фича для сопоставления с образцом, которая может появиться в 2026 году.
- Enhanced Type Inference for Higher-Order Functions — улучшение вывода типов для функций высшего порядка.
Эти изменения обещают сделать TypeScript еще более мощным инструментом для разработки сложных приложений.