TypeScript TypeScript: обзор языка и дорожная карта курса
0%

TypeScript: обзор языка и дорожная карта курса

TypeScript: обзор языка и дорожная карта курса

Что это за язык и какую проблему он решает

JavaScript был спроектирован за десять дней в 1995 году как язык для оживления веб-страниц. Он динамический: тип значения известен только в момент выполнения. Пока программа умещается в паре сотен строк, это удобно — не надо ничего объявлять. Но как только код вырастает до сотен тысяч строк и над ним работают десятки людей, динамическая природа превращается в источник постоянной боли: опечатка в имени поля, undefined is not a function, тихое приведение типов ("5" + 3 === "53"), рефакторинг вслепую. Ошибки, которые компилятор в других языках ловит мгновенно, здесь всплывают только в проде — иногда у пользователя.

TypeScript — это надмножество (superset) JavaScript, добавляющее статическую систему типов. Ключевая идея: любой валидный JavaScript уже является валидным TypeScript, но TypeScript даёт возможность аннотировать код типами, а компилятор (tsc) проверяет их согласованность до запуска и затем стирает типы, выдавая обычный JavaScript. Во время выполнения от TypeScript не остаётся ничего — типы существуют только на этапе разработки и сборки. Это называется type erasure (стирание типов), и это фундаментальное свойство: типы не влияют на поведение программы, они влияют на то, какие программы компилятор вообще пропустит.

// JavaScript пропустит это и упадёт в рантайме
function greet(user) {
  return "Привет, " + user.nmae; // опечатка: nmae вместо name
}

// TypeScript поймает опечатку ещё в редакторе
interface User {
  name: string;
}
function greetTyped(user: User): string {
  return "Привет, " + user.nmae;
  //                        ~~~~ Property 'nmae' does not exist on type 'User'.
}

Философия TypeScript сформулирована в его design goals: статически выявлять вероятные ошибки, но при этом не мешать. Отсюда несколько принципиальных решений, которые важно понять сразу:

  • Постепенная типизация (gradual typing). Можно типизировать проект по кусочкам, оставляя «дыры» в виде any. Это позволяет мигрировать огромные JS-кодовые базы инкрементально, но требует дисциплины (см. strict-режим).
  • Структурная типизация (duck typing). Совместимость типов определяется их формой, а не именем. Если у объекта есть все нужные поля — он подходит, даже если он не «объявлен» как реализация интерфейса. Это отличает TS от номинальных систем вроде Java/C#.
  • Компилятор не гарантирует безопасность в рантайме. Из-за any, приведений (as) и того, что типы описывают ожидания о внешних данных, TypeScript — это unsound система (намеренно). Он ловит подавляющее большинство ошибок, но на границах (сеть, файлы, JSON.parse) типам верить нельзя — нужна рантайм- валидация. Это красная нить всего курса.

Ниши применения

TypeScript стал фактическим стандартом промышленной веб-разработки. По опросам State of JS им пользуется подавляющее большинство профессиональных разработчиков. Основные ниши:

  • Фронтенд. React, Vue, Angular, Svelte — все первоклассно поддерживают TS. Типы описывают props компонентов, состояние, ответы API.
  • Бэкенд на Node.js. Express, Fastify, NestJS. TypeScript даёт типобезопасные контроллеры, ORM (Prisma, Drizzle), валидацию.
  • Полный стек и «shared types». Один монорепозиторий, где типы данных разделяются между сервером и клиентом — исчезает целый класс рассинхронов контракта.
  • CLI и инструменты. Большинство современного тулинга (Vite, esbuild-обёртки, Prettier-плагины) пишется на TS.
  • Библиотеки. Публикуются с .d.ts-файлами, чтобы потребители получали автодополнение и проверку типов.
  • Десктоп (Electron/Tauri) и даже мобильная разработка (React Native).

Там, где нужен предсказуемый низкоуровневый контроль над памятью и максимальная производительность (системное ПО, игровые движки, embedded), выбирают Rust, C++, Go. TypeScript живёт в слое «продуктовой» логики поверх управляемого рантайма (V8), и это его сила, а не ограничение.

Как устроена экосистема

Важно с самого начала разделять две разные роли компилятора:

  1. Проверка типов (type-checking). Это делает только tsc. Медленно, но надёжно. Запускается в редакторе (через LSP) и в CI (tsc --noEmit).
  2. Транспиляция (эмит JS). Это может делать tsc, а может — быстрые инструменты вроде esbuild, swc, Babel. Они не проверяют типы, а просто стирают их и переписывают синтаксис. Отсюда типичная продакшн-схема: сборка быстрым транспилятором, а проверка типов — отдельной командой tsc --noEmit.

Современные рантаймы (Node.js 22+ с --experimental-strip-types, Deno, Bun) умеют исполнять .ts напрямую, стирая типы на лету. Но и там проверку типов по-прежнему выполняет отдельный проход tsc.

Дорожная карта курса

Курс построен так, чтобы провести от «понимаю синтаксис» до «умею вести production-сервис на TypeScript». Порядок неслучаен — каждый файл опирается на предыдущий.

  1. Установка и тулчейн — Node, менеджеры пакетов, tsconfig.json, ESLint, Prettier, сборщики, layout проекта.
  2. Фундамент и система типов — структурная типизация, union/intersection, generics, unknown/any/never, narrowing.
  3. Продвинутые типы, идиомы и ошибки — conditional/mapped types, infer, template literals, satisfies, паттерны и антипаттерны, обработка ошибок.
  4. Конкурентность и асинхронность — event loop, Promise, async/await, AbortController, воркеры, стримы, backpressure.
  5. Тестирование — Vitest/Jest, моки, property- based, покрытие, тест-пирамида, интеграция в CI.
  6. Архитектура и продакшн — слоистая/гексагональная архитектура, DI, конфигурация, БД, устойчивость.
  7. Деплой и наблюдаемость — сборка, Docker, логи (pino), метрики, трейсинг (OpenTelemetry), производительность.
  8. SDLC и лучшие источники — жизненный цикл, CI/CD, релизы, безопасность зависимостей, кураторский список ресурсов.

Как учиться по этому курсу

  • Держите открытым TypeScript Playground. Это REPL с полноценным компилятором прямо в браузере: пишите примеры, наводите курсор на переменные, смотрите выведенные типы. Это главный инструмент обучения.
  • Наведение курсора (hover) — ваш дебаггер типов. В любом редакторе с TS наведите курсор на переменную и увидите её выведенный тип. Понимание того, что вывел компилятор, важнее умения писать аннотации.
  • Не бойтесь читать сообщения об ошибках целиком. Ошибки TS длинные, но они почти всегда точны. Читайте снизу вверх — самая конкретная причина обычно в конце.
  • Основные источники для углубления. Официальный TypeScript Handbook — канонический справочник. Total TypeScript Мэтта Покока — лучший практический материал по системе типов. Книга Effective TypeScript Дэна Вандеркама — 83 конкретных правила «как надо». type-challenges — задачки на типы для прокачки.

Что дальше

Начнём с фундамента, без которого нельзя написать ни строки: настройка тулчейна, tsconfig.json и структура проекта.

Установка и тулчейн

Нашли неточность? Выделите фрагмент текста — рядом появится жучок.

Нужен разбор именно вашей ситуации?

Статья описывает общий случай. Если у вас частный — можно разобрать его отдельно, платно. А если не хватает целого материала, предложите тему: её оплачивают вскладчину, и она выходит открытой для всех.

Доска запросов