БэкендTypeScriptJavaScript

TypeScript без сборки: запускаем код напрямую в Node.js

Запускаем TypeScript-файл напрямую в современном Node.js, разбираем type stripping, ограничения erasable syntax и настройку tsconfig для проверки типов.

Кодик

Автор

6 мин чтения

native TypeScript в Node.js можно освоить на одном небольшом проекте, если сразу видеть вход, действие и результат. Современный Node.js умеет удалять стираемые типы и выполнять многие .ts-файлы без отдельной сборки. Ниже вы соберёте работающий пример и проверите обычный и граничный сценарии.

Для первого серверного скрипта связка компилятора, загрузчика и каталога dist иногда скрывает сам TypeScript за настройкой инструментов. Поэтому отделим настройку, входные данные, основное действие и проверку. В этой статье вы соберёте типизированный CLI-скрипт со списком задач, который запускается командой node tasks.ts. Проверка: Node печатает две задачи, TypeScript отдельно находит намеренную ошибку типов, а JavaScript-файл сборки не создаётся.

1Соберите минимум

проверить версию Node и создать package.json с type module. Не расширяйте проект до первого успешного запуска.

2Увидьте данные

терминал печатает данные без каталога dist. Проверяйте значение, а не отсутствие ошибки.

3Измените правило

После успеха добавьте поле priority и сортировку открытых задач перед выводом. Так копирование станет практикой.

Как устроен учебный проект native TypeScript в Node.js

Node удаляет только синтаксис типов перед выполнением, а проверку типов по-прежнему выполняет команда tsc --noEmit. Держите ввод, логику и отображение раздельно: тогда каждый этап можно проверить отдельно.

ЭтапДействиеПроверяемый результат
Средапроверить версию Node и создать package.json с type moduleNode поддерживает встроенный type stripping
Запусквыполнить tasks.ts напрямуютерминал печатает данные без каталога dist
Проверка типовзапустить tsc --noEmit с подходящими опциямиошибка типов видна до выполнения
Ограничениепопробовать enum или параметр-свойствоне стираемый синтаксис отклоняется или требует transform-types

Контрольные точки: среда, запуск, проверка типов и ограничение. Следующий шаг начинается после совпадения с ожидаемым результатом.

Путь данных в проекте native TypeScript в Node.js
От входных данных до видимого результата. Сначала проверяется вход, затем действие и только потом интерфейс.

Зафиксируйте первый успех Выполните node --version. В Node 22.18+ type stripping включён по умолчанию, а стабильный статус появился в более новых ветках. Сохраните команду запуска и ожидаемый вывод.

Собираем рабочий пример шаг за шагом

Пример рассчитан на современный Node.js с включённым type stripping и сверялся с официальной документацией Node. Создайте проект командой npm init -y и установите только проверяющие типы пакеты: npm i -D typescript @types/node. Проверьте текущую папку через pwd или Get-Location. Вставьте пример целиком, выполните один раз, затем разбирайте по частям.

type Task = {
  id: number
  title: string
  done: boolean
}

function openTasks(tasks: Task[]): Task[] {
  return tasks.filter((task) => !task.done)
}

const tasks: Task[] = [
  { id: 1, title: "Разобрать типы", done: true },
  { id: 2, title: "Запустить .ts", done: false },
  { id: 3, title: "Добавить тест", done: false },
]

for (const task of openTasks(tasks)) {
  console.log(task.id + ". " + task.title)
}
Что должно произойти после запуска
  • Команда node tasks.ts печатает задачи 2 и 3 без шага компиляции.
  • npx tsc --noEmit завершается без ошибок для корректного массива.
  • Повторный запуск даёт тот же предсказуемый результат.
  • Пустой ввод получает понятное сообщение вместо падения.

Во время запуска Node удаляет аннотации : Task, но не доказывает их правильность. Поэтому быстрый запуск и статическая проверка остаются двумя командами. Найдите в примере вход, проверку и место формирования результата.

Хрупкий и проверяемый вариант native TypeScript в Node.js
Что отличает устойчивый проект от случайного запуска. Явные границы делают ошибку локальной и понятной.

Что происходит внутри и почему это работает

Поддерживаемый режим называется type stripping: типы должны быть стираемыми, то есть после удаления оставлять валидный JavaScript. Node не читает tsconfig.json как компилятор и не преобразует произвольный синтаксис. Логику держите отдельно от вывода: функция получает аргумент и возвращает значение, а интерфейс показывает его. Импорты локальных TypeScript-файлов записывайте с расширением .ts. Для проверки таких импортов TypeScript предлагает опцию allowImportingTsExtensions.

ЧастьЗа что отвечаетЧто проверить
Nodeудаляет стираемые аннотации и выполняет оставшийся JavaScriptфайл запускается напрямую и не создаёт dist
TypeScriptпроверяет типы через tsc --noEmitнамеренно неверное поле вызывает диагностику
tsconfigзадаёт строгую проверку и допустимые расширения импортовнастройки согласованы с нативным запуском

Не называйте этот режим полноценной компиляцией TypeScript. Декораторы, enum, namespace с runtime-кодом и некоторые parameter properties требуют преобразования, а не простого удаления. Для большого приложения сборщик всё ещё может отвечать за оптимизацию, совместимость и пути модулей. Не прячьте поток в одном обработчике: сохраните вход, проверьте его, вызовите операцию и только затем обновите интерфейс.

Проверьте границу Замените done: false на done: "нет". Node выполнит файл, но tsc --noEmit должен остановить проверку. Меняйте одно условие за прогон, чтобы видеть причину.

Проверяем проект и добавляем свою функцию

Разделите тип Task и функцию openTasks в отдельный файл, импортируя его по точному пути с расширением .ts. До правки запишите ожидаемое поведение одним предложением. После граничного теста повторите обычный сценарий.

Проверка своими руками
  1. Сохраните ожидаемый результат: Node печатает две задачи, TypeScript отдельно находит намеренную ошибку типов, а JavaScript-файл сборки не создаётся.
  2. Измените правило: добавьте поле priority и сортировку открытых задач перед выводом. Сначала предскажите итог.
  3. Передайте граничное значение и убедитесь, что приложение не падает.
  4. Верните корректные данные и объясните роли трёх основных частей.
Готово, если выполняются все пункты
  • Node поддерживает встроенный type stripping
  • терминал печатает данные без каталога dist
  • ошибка типов видна до выполнения
  • не стираемый синтаксис отклоняется или требует transform-types

Нативный запуск особенно удобен для небольших CLI, скриптов миграции и учебных примеров, где отдельная папка сборки не даёт пользы. Полезная правка проходит от нового ввода до видимого результата.

Четыре контрольные точки native TypeScript в Node.js
Четыре проверки перед следующим шагом. Каждый следующий этап начинается после наблюдаемого результата.

Что запомнить и куда двигаться дальше

Оставьте две команды в scripts: start для Node и check для tsc. В CI запускайте проверку типов, даже если локально файл стартует напрямую. Для закрепления откройте в первом проекте TypeScript, в REST API на Node.js и в проверке данных через Zod.

Как изучить тему в Кодике

Сначала поймите, какие конструкции TypeScript исчезают после проверки, а какие должны превратиться в runtime JavaScript. Сначала восстановите главную функцию и проверьте её на трёх значениях.

ШагЧто разобратьМини-проверка
1. ОсноваОбъекты, массивы, функции и ESM в JavaScriptОбъясните вход и выход функции.
2. Инструментtype, interface, strict и tsc --noEmitПовторите команду по памяти.
3. ПроектCLI со входом, фильтром и форматированным выводомПроверьте два сценария.
4. РефакторингРазделение файлов и проверку допустимого синтаксисаРазделите ввод, логику и вывод.

После этого сравните один и тот же файл до и после ручного удаления типов: оставшийся код должен быть обычным JavaScript. Базовый синтаксис закрепите через курс JavaScript.

Старая версия Node

Команда не понимает .ts или требует флаг. Проверьте официальную таблицу поддержки для своей ветки.

Ожидание проверки типов

Node удаляет типы, но не запускает TypeScript checker. Добавьте tsc --noEmit.

Импорт без расширения

Нативный ESM-резолвер требует точный путь. Укажите ./utils.ts.

Использование enum без понимания

Enum создаёт runtime-код и не является просто стираемым типом. Используйте union или режим transform-types осознанно.

Сверяйтесь с первичной документацией. Команды и ограничения примера проверены по официальной документации Node.js про TypeScript. Если версия инструмента изменилась, официальный источник важнее старого скриншота.

Что получится в итоге

Готовый результат проекта: TypeScript без сборки: запускаем код напрямую в Node.js
Так выглядит законченный учебный проект: есть понятный вход, видимый результат, защита от неверных данных и место для следующего улучшения.

Короткие ответы
Проверяет ли Node типы при запуске TypeScript-файла?

Нет. Он удаляет поддерживаемые аннотации. Ошибки типов ищет tsc или редактор.

Почему не весь TypeScript запускается через type stripping?

Некоторые конструкции требуют генерации нового JavaScript, а не простого удаления синтаксиса.

Что проверять первым, если native TypeScript в Node.js не запускается?

Версию среды, текущую папку, команду запуска и первую строку ошибки.

Как понять, что проект native TypeScript в Node.js работает?

Проверьте основной сценарий, неверный ввод, повторный запуск и один граничный случай.

Можно ли начать с готового кода?

Да. Добейтесь результата, измените одно правило и восстановите ключевую функцию без копирования.

Сделайте один осознанный шаг дальше

Выберите одно улучшение и проведите его от ввода до результата.

Если не хватает основы, перейдите курс JavaScript, затем восстановите ключевую функцию без подсказки.