Перейти к содержимому

TypeScript: обзор раздела

В краткой версии учебника ты уже видел TypeScript вживую: interface против type, дженерики с ограничениями, Partial/Pick/Omit, satisfies, as const и брендированные типы. Это была карта местности. Теперь мы идём в горы: раздел посвящён тому, как система типов устроена изнутри, почему она выводит типы именно так и как заставить её работать на тебя, а не против тебя.

TypeScript — не просто «проверка типов поверх JS». Это полноценный язык типов с собственной семантикой: структурная типизация, вывод типов, условные типы, mapped-типы с переписыванием ключей, template literal types. Всё это по косточкам разобрано в TypeScript Handbook — официальной документации языка, к которой мы будем возвращаться в каждой главе. Большинство разработчиков используют TS годами, так и не понимая механику — и каждый раз борются с компилятором вместо того, чтобы он писал типы за них.

Раздел состоит из четырёх глав, и каждая закрывает свой слой мастерства.

Глава 1 — Система типов и сужение. Фундамент, без которого остальное не держится: чем структурная типизация отличается от номинальной (и почему это важнее, чем кажется), базовые типы, все способы сужения — typeof, instanceof, оператор in, пользовательские предикаты и утверждения. Разбираем interface против type как инженерную конвенцию, а не вкусовщину, и доходим до дискриминированных объединений и исчерпывающих проверок через never. Здесь же — почему never это не «ошибка», а самый мощный инструмент проверки исчерпываемости.

Глава 2 — Дженерики и infer. Дженерики — это не «тип-заполнитель», а механизм параметризации с собственными правилами вывода. Разберём инстанциацию, ограничения через extends, значения по умолчанию, и главное — infer в условных типах: конструкцию, которая превращает TS из проверялки в язык метапрограммирования. Плюс вариантность — почему Cat[] не равно Animal[], хотя Cat extends Animal. Всё это опирается на главы Generics и Conditional Types официального хендбука.

Глава 3 — Условные и mapped-типы, утилиты. Здесь собрано всё, что отличает «пользователя TypeScript» от «автора типов»: условные типы, mapped-типы с модификаторами as, ?, +/-readonly, keyof, template literal types. И разбор встроенных утилит — Partial, Required, Pick, Omit, Record, ReturnType, Parameters, Awaited — с их внутренней реализацией, чтобы ты мог написать свои.

Глава 4 — satisfies, as const, branded types, tsconfig. Прикладная глава. Три приёма, превращающие типы в реальную защиту: satisfies против as, as const и readonly-вывод, брендированные типы для ID и денег. Сравнение enum с as const, разбор strict-флагов tsconfig.json — что именно включит strict, чем noUncheckedIndexedAccess опасен на легаси, и как генерировать типы API из OpenAPI и Prisma, чтобы клиент и сервер жили по одному контракту.

Каждая глава заканчивается разделом «Практика» — задания довольно плотные: рекурсивные типы, типобезопасный API-клиент, отчёт о включении strict-флагов. Рекомендую завести репозиторий ts-playground и вести каждую задачу как отдельный файл с // @ts-expect-error в местах, где ты демонстрируешь ловлю ошибки компилятором. Это же потом уйдёт в портфолио. Для быстрых экспериментов без репозитория удобен TypeScript Playground, а для проверки себя на прочность — репозиторий type-challenges с сотнями задач на вывод типов.

Ты сможешь читать типы из lib.d.ts без боли, писать свои утилитные типы, объяснить на собеседовании разницу между структурной и номинальной типизацией, обосновать выбор interface или type, и собрать tsconfig, который ловит баги вместо тебя. Следующий раздел — React: там типизация станет ещё интереснее, потому что props, хуки и контексты — это всё дженерики и дискриминированные объединения в реальном бою.

Дальше — система типов и сужение.