native TypeScript в Node.js можно освоить на одном небольшом проекте, если сразу видеть вход, действие и результат. Современный Node.js умеет удалять стираемые типы и выполнять многие .ts-файлы без отдельной сборки. Ниже вы соберёте работающий пример и проверите обычный и граничный сценарии.
Для первого серверного скрипта связка компилятора, загрузчика и каталога dist иногда скрывает сам TypeScript за настройкой инструментов. Поэтому отделим настройку, входные данные, основное действие и проверку. В этой статье вы соберёте типизированный CLI-скрипт со списком задач, который запускается командой node tasks.ts. Проверка: Node печатает две задачи, TypeScript отдельно находит намеренную ошибку типов, а JavaScript-файл сборки не создаётся.
проверить версию Node и создать package.json с type module. Не расширяйте проект до первого успешного запуска.
терминал печатает данные без каталога dist. Проверяйте значение, а не отсутствие ошибки.
После успеха добавьте поле priority и сортировку открытых задач перед выводом. Так копирование станет практикой.
Как устроен учебный проект native TypeScript в Node.js
Node удаляет только синтаксис типов перед выполнением, а проверку типов по-прежнему выполняет команда tsc --noEmit. Держите ввод, логику и отображение раздельно: тогда каждый этап можно проверить отдельно.
| Этап | Действие | Проверяемый результат |
|---|---|---|
| Среда | проверить версию Node и создать package.json с type module | Node поддерживает встроенный type stripping |
| Запуск | выполнить tasks.ts напрямую | терминал печатает данные без каталога dist |
| Проверка типов | запустить tsc --noEmit с подходящими опциями | ошибка типов видна до выполнения |
| Ограничение | попробовать enum или параметр-свойство | не стираемый синтаксис отклоняется или требует transform-types |
Контрольные точки: среда, запуск, проверка типов и ограничение. Следующий шаг начинается после совпадения с ожидаемым результатом.

От входных данных до видимого результата. Сначала проверяется вход, затем действие и только потом интерфейс.
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, но не доказывает их правильность. Поэтому быстрый запуск и статическая проверка остаются двумя командами. Найдите в примере вход, проверку и место формирования результата.

Что отличает устойчивый проект от случайного запуска. Явные границы делают ошибку локальной и понятной.
Что происходит внутри и почему это работает
Поддерживаемый режим называется 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. До правки запишите ожидаемое поведение одним предложением. После граничного теста повторите обычный сценарий.
- Сохраните ожидаемый результат: Node печатает две задачи, TypeScript отдельно находит намеренную ошибку типов, а JavaScript-файл сборки не создаётся.
- Измените правило: добавьте поле priority и сортировку открытых задач перед выводом. Сначала предскажите итог.
- Передайте граничное значение и убедитесь, что приложение не падает.
- Верните корректные данные и объясните роли трёх основных частей.
- Node поддерживает встроенный type stripping
- терминал печатает данные без каталога dist
- ошибка типов видна до выполнения
- не стираемый синтаксис отклоняется или требует transform-types
Нативный запуск особенно удобен для небольших CLI, скриптов миграции и учебных примеров, где отдельная папка сборки не даёт пользы. Полезная правка проходит от нового ввода до видимого результата.

Четыре проверки перед следующим шагом. Каждый следующий этап начинается после наблюдаемого результата.
Что запомнить и куда двигаться дальше
Оставьте две команды в 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.
Команда не понимает .ts или требует флаг. Проверьте официальную таблицу поддержки для своей ветки.
Node удаляет типы, но не запускает TypeScript checker. Добавьте tsc --noEmit.
Нативный ESM-резолвер требует точный путь. Укажите ./utils.ts.
Enum создаёт runtime-код и не является просто стираемым типом. Используйте union или режим transform-types осознанно.
Что получится в итоге

Так выглядит законченный учебный проект: есть понятный вход, видимый результат, защита от неверных данных и место для следующего улучшения.
Проверяет ли Node типы при запуске TypeScript-файла?
Нет. Он удаляет поддерживаемые аннотации. Ошибки типов ищет tsc или редактор.
Почему не весь TypeScript запускается через type stripping?
Некоторые конструкции требуют генерации нового JavaScript, а не простого удаления синтаксиса.
Что проверять первым, если native TypeScript в Node.js не запускается?
Версию среды, текущую папку, команду запуска и первую строку ошибки.
Как понять, что проект native TypeScript в Node.js работает?
Проверьте основной сценарий, неверный ввод, повторный запуск и один граничный случай.
Можно ли начать с готового кода?
Да. Добейтесь результата, измените одно правило и восстановите ключевую функцию без копирования.
Выберите одно улучшение и проведите его от ввода до результата.
Если не хватает основы, перейдите курс JavaScript, затем восстановите ключевую функцию без подсказки.