「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との違いと使い分けの判断基準
- 1 Type Strippingとは? — TypeScriptの型注釈を「消す」だけで直接実行する仕組み
- 2 対応バージョンと歴史 — v22.6.0の実験的導入からv25.2.0安定版までの道のり
- 3 実践セットアップガイド — Node.js 22でTypeScriptを直接実行する手順
- 4 知っておくべき制限事項 — enum・namespace・.tsxが使えない理由と代替パターン
- 5 tsx・ts-nodeとの使い分け — 3つのTypeScript実行方法を比較して最適解を選ぶ
- 6 本番環境ではどうする? — 開発はType Stripping、本番はtsc/バンドラーの二刀流戦略
- 7 Type Strippingを知らないまま1年過ごすと
- 8 この記事を書いている理由
- 9 まとめ — 今日から始めるType Stripping
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';
また、ファイル拡張子でモジュールシステムが決まります。.ts は package.json の type 設定に従い、.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ネイティブの他にも tsx と ts-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を配信
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.jsonにerasableSyntaxOnly: trueを追加- 手元の
.tsファイルでnode app.tsを試してみる - enumを使っている箇所を
as constパターンに置き換える - 本番は
tsc --noEmit+ バンドラーの二刀流で安全に運用
TypeScriptの開発体験は、この1〜2年で劇的に進化しています。まずは node app.ts を一度試してみてください。ビルドなしで動くあの体験、きっと気に入ると思いますよ。