SWC поддерживает TypeScript как язык трансформации, но принципиально не
выполняет семантическую проверку типов. Его модель работы основана на
быстром разборе TypeScript-синтаксиса и последующем удалении типов с
трансформацией к целевому JavaScript, что делает его ближе к Babel, чем
к tsc в части ответственности за типобезопасность.
SWC рассматривает TypeScript как надмножество JavaScript на уровне синтаксического анализа. Внутри компилятора реализован полноценный парсер TS/TSX, способный обрабатывать типы, интерфейсы, дженерики, перечисления и современные конструкты ECMAScript, после чего вся типовая информация полностью удаляется на этапе трансформации.
Обработка TypeScript в SWC разделяется на несколько стадий:
1. Парсинг (Parsing)
.ts и .tsx файлов;
.tsx без дополнительной конфигурации
парсеров.
2. Трансформация (Transformation)
3. Генерация кода (Codegen)
Ключевое отличие: отсутствует отдельная стадия type-checking, что существенно ускоряет обработку.
Основная конфигурация задаётся через .swcrc. Поддержка
TypeScript включается через блок jsc.parser:
{
"jsc": {
"parser": {
"syntax": "typescript",
"tsx": true,
"decorators": true,
"dynamicImport": true
}
}
}
import()
выражений.
Дополнительно часто используется блок transform:
{
"jsc": {
"target": "es2020",
"parser": {
"syntax": "typescript",
"tsx": true
},
"transform": {
"react": {
"runtime": "automatic"
}
}
}
}
Основная операция SWC над TypeScript — удаление типов без их проверки.
Пример исходного кода:
function sum(a: number, b: number): number {
return a + b;
}
Результат трансформации:
function sum(a, b) {
return a + b;
}
Удаляются:
При этом сохраняется только исполняемый JavaScript-код.
TypeScript-конструкции, которые полностью исчезают:
interface User {
id: number;
name: string;
}
type ID = string | number;
После компиляции:
Такие конструкции не имеют runtime-представления и полностью удаляются.
enum обрабатывается иначе, поскольку имеет
runtime-значение:
enum Status {
Active,
Disabled
}
Результат:
var Status;
(function (Status) {
Status[Status["Active"] = 0] = "Active";
Status[Status["Disabled"] = 1] = "Disabled";
})(Status || (Status = {}));
При этом:
SWC объединяет поддержку TypeScript и JSX через TSX-парсер.
const App = (): JSX.Element => {
return <div>Hello</div>;
};
Трансформация:
const App = () => {
return React.createElement("div", null, "Hello");
};
или при automatic runtime:
import { jsx as _jsx } from "react/jsx-runtime";
const App = () => {
return _jsx("div", { children: "Hello" });
};
Поддерживаются:
SWC не является TypeScript-компилятором в полном смысле, поэтому отсутствуют следующие возможности:
.d.ts файлов;
tsconfig.json правил компиляции;
Это означает, что код может быть синтаксически корректным, но семантически ошибочным без каких-либо предупреждений.
SWC не использует tsconfig.json как основной источник
конфигурации компиляции. Однако некоторые параметры могут быть частично
сопоставлены вручную:
jsc.target;
module.type;
jsc.transform.react;
Пример несоответствия:
{
"compilerOptions": {
"strict": true,
"noImplicitAny": true
}
}
Эти параметры не влияют на SWC-трансформацию, поскольку не относятся к синтаксическому уровню.
SWC используется как основной трансформер TypeScript-кода вместо Babel:
Type checking выполняется отдельно через tsc –noEmit.
В связке с Vite SWC применяется для ускоренного трансформирования:
Через swc-loader:
module.exports = {
test: /\.[jt]sx?$/,
use: {
loader: "swc-loader",
options: {
jsc: {
parser: {
syntax: "typescript",
tsx: true
}
}
}
}
};
SWC заменяет ts-loader или babel-loader в
части трансформации.
Generics в TypeScript полностью исчезают после компиляции:
function identity<T>(value: T): T {
return value;
}
Результат:
function identity(value) {
return value;
}
Типовая параметризация не влияет на runtime-код.
Поддержка namespace присутствует, но рассматривается как
устаревшая модель:
namespace Utils {
export function log(msg: string) {
console.log(msg);
}
}
Результат:
var Utils;
(function (Utils) {
function log(msg) {
console.log(msg);
}
Utils.log = log;
})(Utils || (Utils = {}));
Поддержка декораторов зависит от включения соответствующего флага:
{
"jsc": {
"parser": {
"syntax": "typescript",
"decorators": true
}
}
}
Пример:
function readonly(target: any, key: string) {}
class Test {
@readonly
method() {}
}
После трансформации формируется обёртка с вызовом декоратора в runtime.
Важно учитывать различие между legacy decorators и stage-3 decorators, которые могут иметь разное поведение в зависимости от версии SWC.
TypeScript-конструкции вида:
import type { User } from "./types";
полностью удаляются:
Обычные импорты сохраняются без изменений.
SWC оптимизирован для высокоскоростной обработки TS-кода:
В типичных проектах разница с tsc и Babel становится
заметной при больших кодовых базах, особенно при активном HMR.
Ключевая граница ответственности:
Это разделение делает их часто используемыми совместно: