Отличие от tsc: только трансформация, не проверка типов

Модель работы 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
  • игнорирует аннотации типов
  • не строит типовую модель программы
  • не проверяет корректность использования типов

Типы рассматриваются как синтаксический шум, который удаляется на этапе парсинга.


Разделение ответственности: принцип «parse & transform»

В SWC процесс компиляции можно свести к следующей цепочке:

  1. Лексический анализ (tokenization)
  2. Построение AST
  3. Синтаксические трансформации AST
  4. Генерация 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 функционирует как слой, работающий исключительно с синтаксисом, оставляя семантику типов внешним инструментам.