Язык TypeScript: полный обзор, плюсы, минусы и пределы
Для чего нужен TypeScript, чем он отличается от JavaScript, где окупается, а где лишний: плюсы и минусы, TypeScript 7, сравнение с JavaScript, JSDoc, Python и Go, примеры кода, пределы и советы.
Коротко
TypeScript — это JavaScript с типами: бесплатный язык с открытым кодом от Microsoft, который проверяет код до запуска и потом превращается в обычный JavaScript. Ошибки, которые раньше всплывали на рабочем сайте, — пропущенное поле, не тот аргумент, забытый вариант — ловятся прямо в редакторе. Это стандарт для серьёзных интерфейсов (React, Angular, Next.js), бэкенда на Node.js, Telegram Mini Apps и расширений браузера, а в TypeScript 7 компилятор переписали на Go, и он стал в разы быстрее. Подвох: типы существуют только при сборке, поэтому данные снаружи всё равно нужно проверять, а слишком хитрые типы делают код сложнее, а не проще.
TypeScript коротко: паспорт языка
Главные факты одной таблицей: откуда язык взялся, как он работает и где запускается.
- Тип
- Надстройка над JavaScript со статической типизацией
- История
- Microsoft, 2012 год; руководит Андерс Хейлсберг, автор C#
- Лицензия
- Apache 2.0 — свободная, в том числе для коммерции
- Как работает
- Типы проверяются при сборке и стираются: в браузер уходит обычный JavaScript
- Типизация
- Статическая и структурная, с выводом типов
- Компилятор
tsc; в TypeScript 7 переписан на Go — по оценке Microsoft, примерно в десять раз быстрее- Запуск без сборки
- Node.js, Deno и Bun запускают файлы
.ts, стирая типы - Совместимость
- Подходит любая библиотека JavaScript; типы для большинства идут в пакете или в @types
- Релизы
- Новая версия примерно раз в три месяца
- Популярность
- Самый используемый язык на GitHub по отчёту Octoverse 2025
- На нём написаны
- VS Code, Angular, интерфейсы Slack и Figma
Для чего применяется TypeScript: 8 сфер
Везде, где работает JavaScript, работает и TypeScript. Под каждой сферой — инструменты, с которыми он обычно идёт.
-
01
Веб-интерфейсы
Личные кабинеты, дашборды и сложные формы: типы держат согласованными сотни компонентов.
-
02
Бэкенд на Node.js
API и сервисы, где фронтенд и бэкенд делят типы и код.
-
03
Полный стек на одном языке
Страницы, серверная логика и API в одном проекте — с типами от базы до кнопки.
-
04
Telegram Mini Apps и боты
Интерфейс внутри мессенджера и его бот на одном языке.
-
05
Расширения браузера
Страницы расширения, фоновый скрипт и сообщения между ними остаются согласованными благодаря типам.
-
06
Мобильные приложения
Одна кодовая база для iOS и Android.
-
07
Десктопные приложения
Приложения для Windows, macOS и Linux на веб-технологиях.
-
08
Функции на краю сети
Небольшие обработчики, которые работают рядом с пользователем, сразу во многих дата-центрах.
Плюсы и минусы TypeScript
TypeScript меняет немного церемоний на много уверенности. Окупится ли обмен, зависит от размера и срока жизни проекта.
Плюсы · 8
-
Ошибки до запуска
Пропущенное поле, не тот аргумент или забытый вариант — красное подчёркивание в редакторе, а не жалоба пользователя.
-
Безопасный рефакторинг
Переименовали поле — компилятор покажет каждое место, которое нужно поправить.
-
Умный редактор
Автодополнение, переход к определению и подсказки работают точно, потому что редактор знает типы.
-
Код сам себя документирует
Сигнатура говорит, что функция принимает и возвращает, — новый разработчик читает, а не угадывает.
-
Весь JavaScript
Любая библиотека из npm, любой фреймворк, любая среда — ничего не теряется.
-
Можно вводить постепенно
Проект на JavaScript переводят файл за файлом, постепенно повышая строгость.
-
Общие типы от фронтенда до бэкенда
Поменяли API — интерфейс, который его использует, не соберётся, пока его не поправят.
-
Быстрый компилятор
TypeScript 7 проверяет большие проекты за секунды вместо минут.
Минусы · 8
-
Типов нет во время работы
После сборки типов нет: данные из API или формы нужно проверять схемой вроде Zod.
-
Лазейка
anyОдин
anyвыключает проверку, и он тихо расползается по коду. -
Хитрые типы
Система типов может выразить почти всё — и ей пользуются, чтобы писать головоломки вместо кода.
-
Настройка
tsconfig, модули ESM и CommonJS, псевдонимы путей — первая настройка всё ещё требует внимания. -
Типы библиотек отстают
Типы из @types пишутся отдельно и иногда не совпадают с настоящей библиотекой.
-
Больше учить
Дженерики, объединения и сужение типов требуют времени у тех, кто пришёл из чистого JavaScript.
-
Лишний для маленьких скриптов
Виджет на пятьдесят строк от типов почти ничего не выигрывает.
-
Код не становится быстрее
После компиляции это тот же JavaScript — TypeScript покупает правильность, а не скорость.
TypeScript и другие: сравнение с JavaScript, JSDoc, Python и Go
Как сравниваются главные способы получить типы в коде. В таблице — поведение, а не бенчмарки.
| Критерий | TypeScript | JavaScript | JS + JSDoc | Python + подсказки | Go |
|---|---|---|---|---|---|
| Когда находятся ошибки | в редакторе и при сборке | во время работы | в редакторе, если включена проверка | отдельной проверкой | при компиляции |
| Типы во время работы | стёрты | нет | нет | игнорируются | соблюдаются |
| Шаг сборки | да или стирание типов | нет | нет | нет | да |
| Рефакторинг большого кода | безопасный | рискованный | безопаснее | безопаснее | безопасный |
| Работает в браузере | после сборки | да | да | нет | через WebAssembly |
| Порог входа | средний | низкий | низкий | низкий | средний |
| Лучше всего для | интерфейсов и сервисов на Node.js | небольших скриптов | библиотек без сборки | данных и ИИ | нагруженного бэкенда |
Когда брать TypeScript, а когда нет
Двенадцать типичных задач с вердиктом. Где TypeScript не лучший выбор, названа альтернатива.
-
Интерфейс-приложение
Лучший выборЛичные кабинеты, дашборды, редакторы — типы окупаются с первого месяца.
-
API или сервис на Node.js
Лучший выборОбщие типы с фронтендом и безопасный рефакторинг.
-
Telegram Mini App
Лучший выборИнтерфейс и бот на одном языке с проверенными данными.
-
Расширение браузера
Лучший выборСообщения между частями расширения остаются согласованными.
-
Проект нескольких разработчиков
Лучший выборТипы — договор, который никто не нарушит незаметно.
-
Библиотека для других
Лучший выборПользователи получают автодополнение и проверки из коробки.
-
Контентный сайт
ПодходитСтраницы собираются на сервере; немного интерактива проживёт и без TypeScript.
-
Прототип на неделю
ПодходитПодойдёт с мягкими настройками; ужесточите, если прототип выживет.
-
Небольшой виджет или скрипт
ПодходитJavaScript с JSDoc даёт подсказки без сборки.
-
Анализ данных и ML
Другой языкPython: библиотеки и блокноты там.
-
Очень высокая нагрузка
Другой языкGo или Rust: компилируемый код и настоящие типы во время работы.
-
Тяжёлые вычисления в браузере
Другой языкRust или C++, скомпилированные в WebAssembly.
Экосистема TypeScript: инструменты для частых задач
Компилятор проверяет типы, всё остальное приходит из мира JavaScript — теперь с типами.
| Задача | Инструменты |
|---|---|
| Проверка типов | tsc |
| Запуск файлов .ts | node, tsx, Deno, Bun |
| Сборка для браузера | Vite, esbuild, Rolldown |
| Проверка данных снаружи | Zod, Valibot, ArkType |
| Типизированная работа с базой | Drizzle, Prisma, Kysely |
| Типизированный API | tRPC, openapi-typescript |
| Линтинг | typescript-eslint, Biome |
| Форматирование | Prettier, Biome |
| Тесты | Vitest, node:test, Playwright |
| Фреймворки | React, Next.js, Angular, NestJS |
| Типы для JS-библиотек | @types/* |
Пределы TypeScript: где он не защищает
-
Данные снаружи
Ответ API, формы или файла имеет тот тип, который вы написали, а не тот, что есть на самом деле. Без схемы проверка — лишь обещание.
-
Приведения типов
as SomeTypeговорит компилятору «поверь мне» — и он верит, даже когда вы ошибаетесь. -
any внутри библиотек
Слабо типизированная зависимость пускает
anyв строгий проект через чёрный ход. -
Очень сложные типы
Глубокие условные и рекурсивные типы тормозят редактор, и следующий разработчик их не прочитает.
-
Скорость
TypeScript не ускоряет код: производительность решают JavaScript и среда выполнения.
-
Модули
Смешение ESM и CommonJS — всё ещё самый частый источник мучений с настройкой.
8 советов, чтобы TypeScript действительно защищал
-
01
strict с первого дня
Включить строгость потом — сотни правок, на старте — бесплатно.
-
02
noUncheckedIndexedAccess
Элемент массива или ключ словаря может не найтись — компилятор должен это знать.
-
03
Входные данные — через схему
Zod или Valibot на каждой границе: API, формы, файлы, переменные окружения.
-
04
unknown вместо any
unknownзаставляет проверить перед использованием,anyмолча выключает всё. -
05
Объединения вместо enum
'new' | 'paid'чисто стирается и работает со стиранием типов,enum— нет. -
06
Дайте типам выводиться
Подписывайте границы функций, а внутри вывод точный, и код остаётся коротким.
-
07
Типы генерировать, а не копировать
Из схемы базы и описания OpenAPI — тогда они никогда не разойдутся.
-
08
Простые типы лучше хитрых
Если тип нужно объяснять комментарием, он, скорее всего, слишком хитрый.
Как выглядит TypeScript: 3 примера
Три примера к главным плюсам: компилятор ловит забытый вариант, данные снаружи проверяются, а типы следуют за кодом. Проверены TypeScript 7 в строгом режиме и запуском в Node.js.
Забытый вариант — ошибка компиляции
У каждого статуса свои поля, а новый статус без обработки просто не соберётся.
// статус заказа — одна из нескольких форм, и у каждой формы свои поля
type Order =
| { status: 'new' }
| { status: 'paid'; paidAt: Date }
| { status: 'shipped'; trackingCode: string };
function describe(order: Order): string {
switch (order.status) {
case 'new':
return 'Ждёт оплаты';
case 'paid':
return `Оплачен ${order.paidAt.toISOString().slice(0, 10)}`;
case 'shipped':
return `В пути: ${order.trackingCode}`; // trackingCode есть только здесь
default: {
// новый статус, добавленный в Order и забытый здесь, — ошибка компиляции
const unhandled: never = order;
return unhandled;
}
}
}
console.log(describe({ status: 'shipped', trackingCode: 'RA123' })); // В пути: RA123
Проверка данных снаружи
Схема Zod проверяет настоящие данные и сразу даёт тип.
import { z } from 'zod';
// типы исчезают после компиляции, поэтому данные снаружи проверяет схема
const Order = z.object({
id: z.number().int().positive(),
email: z.email(),
total: z.number().nonnegative(),
});
type Order = z.infer<typeof Order>; // тип выводится из схемы, без дублирования
const fromApi: unknown = JSON.parse('{"id": 7, "email": "[email protected]", "total": -5}');
const result = Order.safeParse(fromApi);
if (result.success) {
const order: Order = result.data;
console.log(order.total);
} else {
console.log(result.error.issues[0]?.path); // [ 'total' ]
}
Дженерики и satisfies
Одна функция работает с любыми данными и сохраняет их типы, а satisfies проверяет форму, не теряя точных значений.
// обобщённая функция: тип результата следует за входом
function groupBy<T, K extends PropertyKey>(items: readonly T[], key: (item: T) => K): Record<K, T[]> {
const groups = {} as Record<K, T[]>;
for (const item of items) {
(groups[key(item)] ??= []).push(item);
}
return groups;
}
// satisfies проверяет форму, но сохраняет точные значения
const plans = {
start: { price: 0, seats: 1 },
team: { price: 29, seats: 10 },
} satisfies Record<string, { price: number; seats: number }>;
type Plan = keyof typeof plans; // 'start' | 'team', а не просто string
const users = [
{ name: 'Анна', plan: 'team' as Plan },
{ name: 'Олег', plan: 'start' as Plan },
{ name: 'Ира', plan: 'team' as Plan },
];
const byPlan = groupBy(users, (u) => u.plan);
console.log(byPlan.team?.length, plans.team.price); // 2 29
Вопросы о TypeScript
Чем TypeScript отличается от JavaScript?
TypeScript — это JavaScript плюс типы, которые проверяются до запуска кода. После сборки он становится обычным JavaScript.
Нужен ли TypeScript маленькому проекту?
Скрипту на пятьдесят строк — нет. Всему, что будет жить и расти, — да: типы окупаются на первом же рефакторинге.
Сложно ли перевести проект с JavaScript?
Нет: TypeScript принимает файлы JavaScript, поэтому переезд идёт файл за файлом с постепенным повышением строгости.
Замедляет ли TypeScript разработку?
Немного на старте и сильно меньше потом: меньше ошибок, быстрее рефакторинг и меньше времени на то, чтобы понять, что делает код.
Понимает ли браузер TypeScript?
Нет, браузер выполняет JavaScript. Типы стирает сборщик вроде Vite, а Node.js, Deno и Bun умеют делать это на лету.
Что нового в TypeScript 7?
Компилятор переписан на Go: по оценке Microsoft, примерно в десять раз быстрее при том же языке.
Делает ли TypeScript код быстрее?
Нет. Он делает код правильнее, а скорость — как у JavaScript.
TypeScript или JSDoc?
JSDoc даёт типы в комментариях без сборки — хорошо для небольших библиотек. Для приложений TypeScript удобнее и строже.
Используют ли TypeScript на бэкенде?
Да, с Node.js, Deno и Bun — особенно когда фронтенд и бэкенд делят типы.
Форма
Разработка
на TypeScript
Делаю интерфейсы и сервисы на TypeScript: React-приложения, личные кабинеты, Telegram Mini Apps и расширения браузера — строгие типы, быстрая сборка и код, который подхватит ваша команда. Расскажите о задаче — отвечу в течение рабочего дня.