Node.js が .ts を直接実行できる「型ストリッピング」を実際に動かす
これまで TypeScript を Node で走らせるには tsc でのビルド、あるいは ts-node や tsx といったローダが必要だった。2025 年後半から Node.js は「型ストリッピング(type stripping)」を標準搭載し、node file.ts でそのまま .ts を実行できるようになった。実験フラグや警告なしで使える「安定版」になったのは Node.js 24.12.0 と 25.2.0 からだ(機能自体は 22.18 / 23.6 でデフォルト有効化されていたが、実験警告が付いていた)。
型ストリッピングとは何か
Node は TypeScript をコンパイルしているわけではない。型注釈・interface・型エイリアスなど「実行時に消しても意味が変わらない構文」をそのまま削除(ストリップ)して、残った JavaScript を実行するだけだ。内部では Amaro(SWC の TypeScript パーサの WebAssembly ビルド @swc/wasm-typescript の薄いラッパ)を使っている。
重要な性質は 2 つ。
- 型チェックはしない。型エラーがあっても Node は落ちない。型検査は別途
tsc --noEmitで行う。 - コード生成が必要な構文は非対応。
enum、実行時コードを持つnamespace、コンストラクタのパラメータプロパティ、importエイリアスなどはエラーになる。これらは意図的に対象外で、必要ならtsxなどを使う。
実際に試す
前提: Node.js 24.12.0 以上(または 25.2.0 以上)。バージョンを確認する。
1 | |
作業ディレクトリを作り、型注釈と interface を含む .ts を用意する。
1 | |
greet.ts として保存する。
1 | |
フラグなしでそのまま実行する。
1 | |
期待される出力。
1 | |
interface と型注釈が削除され、残りの JavaScript がそのまま動いていることが分かる。ビルド成果物(greet.js)は生成されない。
非対応構文はきちんとエラーになる
enum はコード生成が必要なため型ストリッピングでは扱えない。badenum.ts を用意する。
1 | |
実行すると次のように弾かれる(抜粋)。
1 | |
このエラーコード ERR_UNSUPPORTED_TYPESCRIPT_SYNTAX を覚えておくと、CI で「型ストリッピングでは動かない構文が混入した」ことに気づける。enum の代わりに const オブジェクトや union 型を使うか、tsx に切り替える。
型ストリッピングを無効化する
挙動を止めたい場合は --no-strip-types を付ける。すると .ts は素の JavaScript として解釈され、interface の時点で構文エラーになる。
1 | |
1 | |
「フラグなしなら型ストリッピングが有効」というデフォルト挙動を逆から確認できる。なお --experimental-transform-types(enum なども変換していた実験フラグ)は Node.js 26.0.0 で削除されたため、enum を Node 単体で動かす手段は現状ない。
型チェックは別に走らせる
型ストリッピングはあくまで実行時の話で、型の正しさは保証しない。開発では「実行は node file.ts で速く回し、型検査は別コマンド/CI で回す」構成が定番だ。
1 | |
node は速いフィードバック、tsc --noEmit は型の門番、と役割を分けると、ローダ依存を減らしつつ型安全も保てる。
まとめ
Node.js の型ストリッピングは、ts-node/tsx を挟まずに .ts をそのまま実行できる標準機能で、24.12 / 25.2 から安定版になった。型チェックはしない・enum など一部構文は非対応、という割り切りを理解して使えば、小さなスクリプトや検証用コードの実行が一段軽くなる。手元に Node 24.12 以上があれば、上の greet.ts を貼って node greet.ts を試してほしい。