- Главная
- Typescript
- Компиляция TypeScript: гайд по TSC и TSX
Компиляция TypeScript: гайд по TSC и TSX
В прошлом уроке мы вручную добавляли типы к переменным и функциям, а теперь пора разобраться, как TypeScript-код вообще запускается и превращается в JavaScript. Для этого используются два разных инструмента — TSX и TSC. Они решают разные задачи, и путать их — частая ошибка новичков.
В этом уроке мы:
- Разберёмся, зачем нужен
tsxи чем он отличается от обычного запуска кода. - Скомпилируем файл с помощью
tscи посмотрим, что происходит при ошибке типов. - Сравним оба инструмента и поймём, когда какой использовать.
Подготовка
Создайте файл greet.ts со следующим содержимым:
function greet(name: string): string {
return `Hello, ${name}!`;
}
// Ошибка: передаём число вместо строки
console.log(greet(42));
Обратите внимание: функция greet ожидает строку, но мы намеренно передаём число. Именно на этой ошибке хорошо видна разница между инструментами.
Ваше задание
Попробуйте запустить этот файл двумя способами — сначала через tsx, затем через tsc — и сравните результат. Обратите внимание, в каком случае TypeScript сообщит об ошибке, а в каком — нет.
Пошаговый разбор
Разберём оба варианта по шагам.
Шаг 1: Устанавливаем TSX
tsx — это утилита, которая запускает .ts-файлы напрямую, без отдельного шага компиляции. Установите её глобально:
npm install -g tsx
Шаг 2: Запускаем файл через TSX
Выполните команду:
tsx greet.ts
Результат в консоли:
Hello, 42!
Файл выполнился без единой ошибки, хотя мы передали число вместо строки. Дело в том, что tsx просто удаляет типы из кода и запускает получившийся JavaScript — полноценной проверки типов при этом не происходит.
Шаг 3: Устанавливаем TSC
tsc — это официальный компилятор TypeScript. Он не только превращает .ts в .js, но и полностью проверяет типы. Установите его как зависимость проекта:
npm install typescript --save-dev
Шаг 4: Компилируем файл через TSC
Запустите компилятор:
npx tsc greet.ts
На этот раз в консоли появится ошибка:
greet.ts:6:19 - error TS2345: Argument of type 'number' is not assignable to parameter of type 'string'.
6 console.log(greet(42));
~~
Found 1 error in greet.ts:6
tsc нашёл именно ту проблему, которую tsx пропустил. Но есть нюанс: несмотря на ошибку, рядом с greet.ts всё равно появится скомпилированный файл greet.js — по умолчанию компилятор эмитит файлы, даже если находит ошибки типов.
Шаг 5: Останавливаем эмит при ошибке
Если вы хотите, чтобы tsc не создавал .js-файл при наличии ошибок, добавьте флаг --noEmitOnError:
npx tsc greet.ts --noEmitOnError
Теперь при ошибке типов файл greet.js создан не будет — компиляция полностью остановится на этапе проверки.
TSX и TSC: в чём разница
Сведём различия в таблицу:
| Характеристика | TSX | TSC |
|---|---|---|
| Проверка типов | ❌ Нет | ✅ Да |
| Создаёт .js-файл | ❌ Нет, выполняет сразу | ✅ Да |
| Скорость | Быстрее, для итераций | Медленнее, зато надёжнее |
| Когда использовать | Локальная разработка, скрипты | Сборка проекта, CI, продакшен |
Проще говоря: tsx — это инструмент для быстрого прототипирования, а tsc — это инструмент, который гарантирует, что ваш код действительно безопасен по типам, прежде чем попадёт в продакшен.
Запуск и проверка
Чтобы убедиться, что вы всё сделали правильно, выполните оба варианта запуска ещё раз:
tsx greet.ts
npx tsc greet.ts --noEmitOnError
Первая команда должна вывести Hello, 42! без ошибок, вторая — сообщить об ошибке типов и не создать greet.js.
Бонус: дополнительные флаги
- Флаг
--watchзаставляетtscследить за файлом и пересобирать его при каждом сохранении — удобно во время разработки. - Флаг
--noEmitзапускает только проверку типов, вообще не создавая файлы — пригодится, если сборкой проекта занимается другой инструмент, например Vite или esbuild. - Попробуйте исправить ошибку в
greet.ts, заменив42на строку, и убедитесь, что оба инструмента теперь выполняются без замечаний.
Итог
В этом уроке мы разобрались с двумя ключевыми инструментами TypeScript-разработки:
- TSX — быстрый запуск
.ts-файлов без проверки типов, удобен для итераций и экспериментов. - TSC — официальный компилятор, который проверяет типы и превращает TypeScript в JavaScript.
- Флаг
--noEmitOnErrorне даёт компилятору создавать файлы при наличии ошибок типов. - Выбор инструмента зависит от задачи:
tsx— для разработки,tsc— для финальной сборки и проверки.
В следующем уроке мы подробнее разберём сам компилятор — как он работает «под капотом» и какие возможности открывает tsconfig.json.