Модель работы TypeScript Compiler (tsc)
Компилятор TypeScript Compiler выполняет две ключевые задачи в едином
процессе:
-
Проверка типов (type checking)
-
Трансформация TypeScript → JavaScript
Эти этапы тесно связаны и работают на основе единого AST (Abstract
Syntax Tree), построенного с учётом типовой системы TypeScript.
Ключевая особенность: типовая система является неотъемлемой
частью компиляции. Это означает, что любые ошибки типов
обнаруживаются в момент компиляции и могут прерывать процесс генерации
JavaScript-кода.
Последствия объединённого подхода
-
Компиляция может быть медленнее на больших проектах
-
Проверка типов всегда выполняется, даже если нужна только трансформация
-
AST содержит типовую информацию, которая затем используется при проверке
-
Выходной JavaScript формируется только после завершения type-checking
этапа
Таким образом, tsc — это одновременно и транслятор, и
статический анализатор типов.
Модель работы SWC: только трансформация
SWC реализует принципиально иной подход: он не выполняет
проверку типов вообще.
Его задача ограничена исключительно преобразованием кода:
-
TypeScript → JavaScript
-
JSX → JavaScript
-
современные стандарты ECMAScript → более старые версии (если требуется)
-
синтаксические трансформации (decorators, optional chaining и др.)
Отсутствие type checking как фундаментальное решение
SWC:
-
не анализирует систему типов TypeScript
-
игнорирует аннотации типов
-
не строит типовую модель программы
-
не проверяет корректность использования типов
Типы рассматриваются как синтаксический шум, который
удаляется на этапе парсинга.
В SWC процесс компиляции можно свести к следующей цепочке:
-
Лексический анализ (tokenization)
-
Построение AST
-
Синтаксические трансформации AST
-
Генерация JavaScript-кода
При этом отсутствует этап:
-
semantic analysis (в части типов)
Это радикально упрощает pipeline и уменьшает количество вычислений.
Практическое различие в поведении при ошибках
Поведение tsc
const value: number = "string";
Результат:
-
ошибка компиляции
-
JavaScript не генерируется
-
процесс сборки может быть остановлен
Поведение SWC
Тот же код:
const value: number = "string";
Результат:
-
код будет преобразован в JavaScript
-
аннотация
: number будет удалена
-
ошибка не будет обнаружена
Фактически на выходе:
const value = "string";
Причины отказа SWC от type checking
Производительность
Type checking — один из самых дорогих этапов компиляции TypeScript. Он
включает:
-
построение графа типов
-
разрешение generics
-
проверку совместимости типов
-
анализ контекстов модулей
SWC оптимизирует именно скорость, поэтому исключает этот слой полностью.
Разделение инструментов в экосистеме
В современных сборочных пайплайнах часто используется разделение:
-
SWC — трансформация
-
TypeScript Language Service или tsc — проверка типов
Это позволяет запускать процессы параллельно:
-
быстрый билд без ожидания type-checking
-
отдельный процесс контроля типов в CI
Влияние на архитектуру проектов
Подход 1: tsc как единственный инструмент
-
единый pipeline
-
строгая гарантия корректности типов
-
более медленные сборки
-
блокировка при ошибках типов
Подход 2: SWC + отдельная проверка типов
-
SWC отвечает только за AST → JS
-
tsc запускается отдельно (например,
–noEmit)
-
сборка не зависит от проверки типов
-
возможна параллелизация процессов
Отличие в обработке TypeScript синтаксиса
SWC поддерживает удаление типов как синтаксическую операцию:
|
Конструкция TypeScript
|
Поведение SWC
|
interface
|
удаляется полностью
|
type
|
удаляется полностью
|
: number
|
удаляется
|
as const
|
трансформируется
|
|
generics
|
удаляются
|
|
enums
|
может трансформироваться в JS
|
В tsc эти конструкции участвуют в семантическом анализе и влияют на
компиляцию.
Ошибки, которые SWC не обнаруживает
SWC не выявляет:
-
несовместимость типов
-
отсутствие свойств у объектов
-
неправильные generics
-
ошибки приведения типов
-
нарушения контрактов интерфейсов
Все эти проверки относятся исключительно к зоне ответственности tsc или
другого type checker.
Влияние на сборочные системы
Использование SWC меняет роль TypeScript в проекте:
-
TypeScript становится надстройкой для статического анализа
-
JavaScript-выход формируется без участия типовой системы
-
сборка становится ближе к Babel-подходу
По сути SWC выполняет роль высокопроизводительного транспайлера,
аналогичного:
-
Babel (но значительно быстрее за счёт Rust-реализации)
Ключевое различие моделей компиляции
|
Характеристика
|
tsc
|
SWC
|
|
Type checking
|
есть
|
отсутствует
|
|
Трансформация
|
есть
|
есть
|
|
Скорость
|
средняя
|
высокая
|
|
Семантический анализ
|
полный
|
отсутствует
|
|
Назначение
|
компилятор TypeScript
|
транспайлер
|
Последствия для разработки
Разделение трансформации и проверки типов приводит к архитектурному
сдвигу:
-
сборка перестаёт зависеть от корректности типов
-
ошибки типов становятся отдельным этапом контроля качества
-
увеличивается гибкость CI/CD процессов
-
уменьшается время hot-reload в разработке
SWC функционирует как слой, работающий исключительно с синтаксисом,
оставляя семантику типов внешним инструментам.