SWC выполняет трансформацию TypeScript и современного JavaScript в
исполняемый JavaScript, фокусируясь на синтаксическом анализе и
генерации кода. В отличие от TypeScript-компилятора (tsc),
система не предназначена для полноценной семантической проверки типов.
Это фундаментально определяет поведение при наличии типовых ошибок.
Ключевая особенность: SWC не выполняет статическую проверку типов, он их удаляет в процессе трансформации.
TypeScript-часть входного кода рассматривается как расширенный синтаксис JavaScript. Типы, интерфейсы, дженерики и прочие конструкции существуют только на этапе парсинга и затем полностью элиминируются.
function sum(a: number, b: number): number {
return a + b;
}
sum("1", "2");
При обработке SWC данный код будет преобразован в:
function sum(a, b) {
return a + b;
}
sum("1", "2");
Ошибки несоответствия типов полностью игнорируются, поскольку для трансформатора они не являются частью исполняемой модели программы.
Поведение SWC при ошибках можно разделить на два принципиально разных класса:
SWC строго проверяет корректность синтаксиса JavaScript/TypeScript. Ошибки на этом уровне приводят к немедленному падению трансформации.
Примеры:
const a = ;
или
function test( { return 1 }
Такие конструкции нарушают грамматику языка, и SWC не способен построить AST. В этом случае компиляция прерывается.
Свойство: синтаксические ошибки блокируют процесс компиляции полностью.
Типовые ошибки относятся к семантическому уровню TypeScript и не влияют на структуру AST.
const value: number = "text";
interface User {
id: number;
}
const u: User = { id: "wrong" };
SWC:
Свойство: типовые ошибки не обнаруживаются и не влияют на результат трансформации.
SWC построен как компилятор с этапами:
На этапе 1–2 обрабатывается только синтаксис. Типы TypeScript существуют как аннотации и игнорируются в semantic layer, которого в SWC нет в классическом виде.
Отсутствие семантического анализатора приводит к следующим характеристикам:
При включении jsc.parser.typescript SWC начинает понимать
TypeScript-синтаксис:
{
"jsc": {
"parser": {
"syntax": "typescript"
}
}
}
Это изменяет только грамматику входного языка, но не добавляет type-checking.
Поддержка TypeScript в SWC означает:
Не означает:
Хотя типовые ошибки игнорируются, SWC может выдавать ошибки другого характера, связанные с невозможностью корректного разбора AST или применения трансформаций.
type A = ;
Это синтаксически некорректное объявление типа, и SWC остановит обработку.
Иногда ошибки возникают при неоднозначном синтаксисе:
(<T>() => {})
Если конфигурация парсера не соответствует используемому стандарту ECMAScript, возможно падение компиляции.
SWC используется в разных окружениях:
@swc/cli)
swc-loader)
@swc/core)
Во всех случаях сохраняется единая модель:
типовые ошибки не диагностируются на уровне SWC
При выполнении:
swc src -d dist
результат:
Для понимания поведения SWC важно учитывать различие с tsc.
| Возможность | SWC | TypeScript Compiler |
|---|---|---|
| Проверка типов | нет | да |
| Удаление типов | да | да |
| Проверка интерфейсов | нет | да |
| Ошибки несоответствия типов | игнорируются | диагностируются |
| Скорость | очень высокая | ниже |
| Семантический анализ | отсутствует | присутствует |
Поскольку SWC не проверяет типы, несоответствия типов переходят в runtime.
function multiply(a: number, b: number): number {
return a * b;
}
multiply("2", "3");
После компиляции:
function multiply(a, b) {
return a * b;
}
multiply("2", "3");
Результат:
* с строками
NaN в зависимости от значений
Следствие: ответственность за корректность типов переносится на разработчика или внешние инструменты.
Так как SWC не выполняет type-checking, часто применяется комбинированный подход:
tsc –noEmit) отвечает за проверку типов
Это приводит к разделению пайплайна:
TypeScript source
↓
tsc (type check only)
↓
SWC (transpile)
↓
JavaScript output
Параметры вроде:
strict
noImplicitAny
strictNullChecks
полностью игнорируются SWC.
Причина: эти флаги относятся к semantic analysis layer TypeScript-компилятора, которого SWC не реализует.
SWC поддерживает плагины трансформации AST. В этом контексте могут возникать дополнительные ошибки, не связанные с типами:
Однако даже здесь типовая система TypeScript не участвует.
В проектах, где одновременно используются JavaScript и TypeScript файлы, SWC:
// JS
function a(x) {
return x + 1;
}
// TS
function a(x: number): number {
return x + 1;
}
Результат генерации будет идентичным по структуре.
SWC демонстрирует строго определённую модель обработки:
Такая архитектура обеспечивает высокую скорость трансформации, но исключает участие SWC в процессе статического анализа типов.