Node.js 22でTypeScript直接実行!Type Strippingの仕組みと実践ガイド

「TypeScriptを使いたいけど、毎回ビルドするのが面倒…」そう感じたことはありませんか?

実は、Node.js 22以降なら、TypeScriptファイルをそのまま node example.ts で実行できるようになっています。その仕組みが「Type Stripping」です。

この記事では、Type Strippingの仕組みから実践的なセットアップ手順、知っておくべき制限事項、そしてtsx・ts-nodeとの比較まで、実務で使えるレベルで解説します。

こんな方におすすめ

  • TypeScriptのビルドステップが面倒で、もっと手軽に実行したい方
  • tsx・ts-nodeを使っているが、Node.jsネイティブの方法を知りたい方
  • Node.js 22の新機能をキャッチアップしておきたい方
  • TypeScriptの開発サイクルをもっと高速化したい方

この記事でわかること

  • Type Strippingの仕組み(ホワイトスペース置換の具体例付き)
  • Node.js 22でTypeScriptを直接実行するセットアップ手順
  • enumが使えないなどの制限事項と代替パターン
  • tsx・ts-nodeとの違いと使い分けの判断基準
僕は普段、福祉事業のIT全般を担当しながら、個人でもTypeScript × Node.jsのシステム開発をしています。24時間稼働のAIエージェントシステムをTypeScript + npm workspacesのモノレポで構築・運用しており、ビルドの手間は日々の実感として身に染みています。

Type Strippingとは? — TypeScriptの型注釈を「消す」だけで直接実行する仕組み

Type Strippingを一言で説明すると、TypeScriptの型注釈をホワイトスペース(空白)に置き換えて、JavaScriptとして実行する仕組みです。

普通、TypeScriptを動かすには tsc でJavaScriptにコンパイルしてから node で実行しますよね。この「コンパイル → 実行」の2ステップが、Type Strippingでは不要になります。

具体的にどうなるかというと、こんな感じです:

// あなたが書いたTypeScriptコード
function greet(name: string): string {
  return `Hello, ${name}!`;
}

// Type Strippingが内部で変換した結果
function greet(name        )         {
  return `Hello, ${name}!`;
}

: string という型注釈がスペースに置き換わっているのが分かりますか? ポイントは、型を「削除」するのではなく「空白で埋める」ことです。これにより、元のソースコードと行番号・列番号が完全に一致するため、エラーが起きたときのスタックトレースがそのまま使えます。ソースマップも不要です。

この技術的な起源は、Bloombergが開発した ts-blank-space というライブラリにあります。Node.jsのコアチームがこのアプローチを採用し、ネイティブ機能として組み込みました。

イメージとしては、「型の部分だけ消しゴムで消して、でも行のレイアウトは崩さない」という感じです。翻訳せずに不要な部分だけ消すから、速いし、シンプルなんですよね。

対応バージョンと歴史 — v22.6.0の実験的導入からv25.2.0安定版までの道のり

Type Strippingは一気に登場したわけではなく、段階的に進化してきました。タイムラインで整理するとこうなります:

時期 バージョン 変更内容
2024年8月 Node.js v22.6.0 Type Stripping 実験的導入(--experimental-strip-types フラグ必須)
2024年9月 Node.js v22.7.0 --experimental-transform-types 追加(enum/namespace変換対応)
2025年1月頃 Node.js v23.6.0 / v22.18.0 デフォルト有効化(フラグなしで .ts を直接実行可能に)
2025年11月 Node.js v25.2.0 安定版(stable)に到達

つまり、今Node.js 22のLTS版を使っている人なら、v22.18.0以降にアップデートすれば、何のフラグもなしに node app.ts が動きます

ちなみに、State of JS 2025調査では「TypeScript has won(TypeScriptの勝利)」と結論づけられるほど、TypeScriptはプロの開発現場でベースラインとして確立されています。Type StrippingはこのTypeScript普及の流れを、Node.jsが公式にサポートした形ですね。

実践セットアップガイド — Node.js 22でTypeScriptを直接実行する手順

では、実際に手を動かしてみましょう。セットアップは驚くほどシンプルです。

ステップ1: Node.jsバージョンの確認

node -v
# v22.18.0 以降であればOK

v22.18.0未満の場合は、Node.js公式サイトからLTS版をダウンロードしてアップデートしてください。

ステップ2: tsconfig.jsonの設定

Type Strippingを快適に使うために、以下のtsconfig.json設定を推奨します

{
  "compilerOptions": {
    "target": "esnext",
    "module": "nodenext",
    "rewriteRelativeImportExtensions": true,
    "erasableSyntaxOnly": true,
    "verbatimModuleSyntax": true,
    "noEmit": true
  }
}

特に重要なのが erasableSyntaxOnly: true です。これはTypeScript 5.8以降の設定で、Type Strippingで動作しない構文(enum・namespace・パラメータプロパティ)を使った場合に、コンパイル時に警告してくれます。つまり「これNode.jsで直接実行できないよ」と教えてくれるセーフティネットですね。

ステップ3: 実行してみる

# TypeScriptファイルをそのまま実行
node app.ts

# v22.6.0〜v22.17.x の場合はフラグが必要
node --experimental-strip-types app.ts

importの書き方に注意

Type Strippingを使うときの一番のハマりポイントがimport文です。型のimportには type キーワードを明示する必要があります:

// ✅ 正しい書き方
import { myFunction, type MyType } from './module.ts';
import type { Config } from './config.ts';

// ❌ 動かない書き方(型か値かNode.jsが判断できない)
import { MyType } from './module.ts';

また、ファイル拡張子でモジュールシステムが決まります。.tspackage.jsontype 設定に従い、.mts はESM強制、.cts はCommonJS強制です。なお、.tsx は非対応なので注意してください。

知っておくべき制限事項 — enum・namespace・.tsxが使えない理由と代替パターン

Type Strippingは万能ではありません。「型注釈を空白に置き換える」だけの仕組みなので、JavaScriptのコードを生成する必要がある構文は対応できません。

具体的には、以下の構文が使えません:

  • enum — JavaScriptにはenumがないため、オブジェクトへの変換が必要
  • namespace — JavaScriptのスコープに変換する処理が必要
  • パラメータプロパティconstructor(private name: string) のような省略記法
  • .tsx ファイル — JSXの変換処理が必要なため非対応

でも安心してください。特によく使うenumには、シンプルで実用的な代替パターンがあります:

// ❌ enumはType Strippingで動かない
enum Color {
  Red = 'red',
  Blue = 'blue',
  Green = 'green'
}

// ✅ as const パターンで代替
const Color = {
  Red: 'red',
  Blue: 'blue',
  Green: 'green'
} as const;

type Color = typeof Color[keyof typeof Color];
// 型としても使える: 'red' | 'blue' | 'green'

この as const パターンは、enumと同じように定数グループとして使えるうえに、TypeScriptコミュニティでも広く推奨されている書き方です。むしろenum よりも型推論が正確で、ツリーシェイキングにも対応しやすいメリットがあります。

どうしてもenum/namespaceを使いたい場合

  • node --experimental-transform-types app.ts フラグで変換に対応可能(v22.7.0+)
  • ただし、ソースマップ生成が必要になるため、Type Strippingの「シンプルさ」というメリットが薄れます
  • 新規プロジェクトなら as const パターンに統一するのがおすすめです

tsx・ts-nodeとの使い分け — 3つのTypeScript実行方法を比較して最適解を選ぶ

TypeScriptを直接実行する方法は、Node.jsネイティブの他にも tsxts-node があります。どれを使えばいいか迷いますよね。以下のテーブルで比較してみましょう:

項目 Node.js ネイティブ tsx ts-node
追加インストール 不要 必要(23MB) 必要(27MB)
実行コマンド node app.ts tsx app.ts ts-node app.ts
型チェック なし なし あり(オプション)
enum/namespace フラグで対応 対応 対応
tsconfig.json解析 なし あり あり
.tsx / JSX 非対応 対応 対応
REPL 非対応 非対応 対応
GitHubスター 約10K 約13K

結論として、使い分けの判断基準はこうなります

  • Node.jsネイティブ — 外部依存ゼロでシンプルに使いたい方。新規プロジェクトで as const パターンに統一できるなら最適解
  • tsx — enum や JSX を使う既存プロジェクト。esbuild内蔵で高速。CI環境でも安定
  • ts-node — TypeScript REPLが欲しい場合。型チェック付き実行も可能だが、速度面ではやや不利

僕の場合は、新しいスクリプトやプロトタイプは node app.ts でサッと実行し、既存のモノレポプロジェクトのビルドは従来通り tsc を使う、という使い分けをしています。

本番環境ではどうする? — 開発はType Stripping、本番はtsc/バンドラーの二刀流戦略

ここで大事な注意点があります。Type Strippingは型チェックを一切行いません。型注釈を空白に置き換えるだけなので、型エラーがあっても素通りしてしまいます。

つまり、本番環境のデプロイに Type Stripping だけで臨むのは危険です。おすすめは「開発 × 本番の二刀流戦略」です:

  • 開発時node app.ts で高速イテレーション。ビルド不要でサクサク動作確認
  • 型チェックtsc --noEmit をCIやpre-commitフックで実行。型エラーを確実にキャッチ
  • 本番デプロイtsc や esbuild/Vite などのバンドラーで正式にビルド。最適化されたJavaScriptを配信
僕が運用しているAIエージェントシステムでも、開発中のちょっとした動作確認は node script.ts で済ませつつ、本番デプロイ前には必ず npm run build(tsc)を通しています。この二刀流にしてから、開発中のイテレーション速度が体感で1.5倍ほど上がりました。

また、node_modules 内のTypeScriptファイルはType Strippingの処理対象外です。npmパッケージとして公開する場合は、必ずJavaScriptにビルドしてから配布してください。

Type Strippingを知らないまま1年過ごすと

正直なところ、tscでビルドしてからnodeで実行する従来のフローでも、もちろん開発はできます。でも、ちょっとしたスクリプトの動作確認や、プロトタイプの検証で毎回ビルドを挟む時間は、積み重なると大きなロスになります。

1日5分のビルド待ちが、1年で約20時間。その20時間を「考える時間」や「試す時間」に回せたらどうでしょうか。

また、Node.jsのエコシステムは急速にTypeScriptネイティブ対応に向かっています。今のうちにType Strippingの仕組みと制限事項を理解しておかないと、チームメンバーが当たり前に node app.ts を使い始めたとき、自分だけ取り残される可能性もあります。

この記事を書いている理由

僕自身、TypeScript × Node.jsのモノレポプロジェクトを毎日触っています。Mac mini上で24時間稼働するAIエージェントシステムを運用していて、コードを修正するたびに npm run build を叩くのが日常でした。

Type Strippingを知ったとき、「ちょっとした確認のためにビルドを回さなくていいのか!」と純粋に感動したんですよね。実際に使い始めてから、開発サイクルの回転が明らかに速くなりました。

以前、TypeScript 7.0(tsgo)でビルドが10倍速になるという記事も書きましたが、Type Stripping(ビルド不要)× tsgo(ビルド高速化)の両輪が揃えば、TypeScript開発の体験は一段と良くなります。この流れを一人でも多くの人に伝えたくて、この記事を書いています。

まとめ — 今日から始めるType Stripping

Node.js 22のType Strippingは、TypeScript開発の「ちょっとした面倒さ」を解消してくれる機能です。仕組みはシンプルで、制限事項さえ理解すれば、今日からすぐに使えます。

今日からできるアクション

  • node -v でバージョン確認。v22.18.0以降なら準備完了
  • tsconfig.jsonerasableSyntaxOnly: true を追加
  • 手元の .ts ファイルで node app.ts を試してみる
  • enumを使っている箇所を as const パターンに置き換える
  • 本番は tsc --noEmit + バンドラーの二刀流で安全に運用

TypeScriptの開発体験は、この1〜2年で劇的に進化しています。まずは node app.ts を一度試してみてください。ビルドなしで動くあの体験、きっと気に入ると思いますよ。