Инструменты и компилятор
TypeScript не выполняется — он компилируется. Ни браузер, ни Node.js не понимают ни одной аннотации типа; между .ts-файлом и работающим кодом всегда стоит компилятор tsc, который проверяет типы и выдаёт чистый JavaScript, где от типов не осталось и следа. Понять инструментарий TypeScript — значит понять эту одностороннюю дверь: типы живут только на этапе компиляции и полностью стираются перед запуском.
Вся остальная тема — про то, как управлять этим компилятором. tsconfig.json — единый пульт: он решает, в какой диалект JavaScript целиться, какую систему модулей использовать и куда класть результат. Флаг strict — зонтик, включающий строгие проверки разом. А ambient-объявления (.d.ts) — способ рассказать компилятору о коде, который он не видит: глобалах и библиотеках на чистом JS. Карта ниже ведёт от запуска tsc к тонкой настройке.
Карта темы
- Компиляция через tsc — что делает
tsc, почему типы стираются при эмите и как проверка типов отделена от бандлинга. - tsconfig.json — единый пульт компилятора:
target,module,outDir,rootDir,libи какinclude/excludeвыбирают файлы. - Строгий режим —
strictкак зонтик надstrictNullChecks,noImplicitAnyи другими; все проверки — на этапе компиляции. - Ambient-объявления (.d.ts) —
declare, файлы.d.tsи пакеты@typesдля описания кода, который компилятор не видит.
Частые ошибки и ловушки
| Ошибка | Последствие |
|---|---|
| Думать, что типы остаются в выводе | tsc стирает все типы; в рантайме нет ни interface, ни аннотаций — instanceof по интерфейсу невозможен |
Считать, что браузер запускает .ts напрямую | Нужен шаг компиляции; без tsc (или другого транспайлера) код не запустится |
Полагаться на tsc как на сборщик/минификатор | tsc только проверяет типы и транспилирует; бандлинг и оптимизацию делают отдельные инструменты |
Считать strict одной проверкой | Это зонтик над семейством флагов (strictNullChecks, noImplicitAny, …) — включаются все разом |
Ждать, что strictNullChecks добавит проверки в рантайм | Все проверки только на этапе компиляции; в выданный JS ничего не вставляется |
Путать noImplicitAny с запретом any | Явный any по-прежнему разрешён; флаг ругается лишь на неявно выведенный any |
Думать, что .d.ts содержит реализацию | .d.ts — только сигнатуры типов; кода в нём нет, он ничего не эмитит |
Считать, что declare создаёт значение | declare лишь обещает компилятору, что значение существует где-то ещё; сам он ничего не создаёт |
Значение для собеседований
Инструментарий спрашивают, чтобы отделить тех, кто «пишет типы», от тех, кто понимает, что типов нет в рантайме. Кандидат, который объясняет tsc как «проверил типы, стёр их, выдал JavaScript», сразу задаёт верную модель.
Что обычно проверяют:
- Что
tscделает с типами и почему их нет в выводе. - Роль
tsconfig.jsonи смыслtarget/module/outDir. - Что такое
strictи почему это зонтик, а не одна проверка. - Зачем нужны
declareи.d.tsи как типизировать нетипизированную библиотеку.
Типичный неверный ответ: «TypeScript проверяет типы во время выполнения». Это открывает разговор о стирании типов: проверки происходят только при компиляции, а в рантайм уходит обычный JavaScript без единой аннотации.