TypeScript
JavaScriptに静的型を足した言語。Node.jsでブラウザとサーバーを同じ言語で書く
分野「言語・実行環境」:プログラムを書くための「言葉」と、それを動かす仕組み。 分野の役割とつながりは分野の解説へ。
別名:TS、tsc、Node.js、JavaScript
できること
- ブラウザ向けの画面を作る :操作できる Web 画面を作りたい
- コマンドラインツールを作る :ターミナルから使う道具を作りたい
- HTTP API を公開する :自分のデータや処理を他から呼ばせたい
- HTTP API を呼び出す :外部サービスからデータを取りたい
- 常時起動のプロセスを保持する :WebSocket や常駐ワーカーを動かしたい
TypeScript ができないこと
- 実行時の型検査(型注釈はコンパイル時に消える。API 応答や JSON.parse の結果は別途検証が必要)
- Node.js 単体での型エラーの検出(Node.js の TypeScript 直接実行は型を削るだけで検査しない)
- Node.js 単体での enum・namespace・パラメータプロパティを含むコードの実行(tsc かバンドラーで変換が必要)
- 標準の CPU 並列処理(Node.js はシングルスレッドのイベントループ。worker_threads を明示的に使う)
- 実行環境なしの配布(実行には Node.js かブラウザが必要で、Go のような単一バイナリにはならない)
制約
先頭の行が、このツールで最も先に当たる制約。値はすべて出典の一次情報で確認したもの。
| 項目 | 値 | 影響 | 出典 | 検証日 |
|---|---|---|---|---|
| 型の実行時消失 (主要制約) | 型注釈は JavaScript の一部ではなく、コンパイル時に完全に削除される。型が実行時の動作を変えることはない | 外部から入る値(HTTP 応答、フォーム入力、環境変数)は型を付けても検証されない。zod 等による実行時検証を境界に置く | www.typescriptlang.org | |
| 型エラー時の出力 | noEmitOnError の既定は false。型エラーがあっても JavaScript は出力される | 型エラーを放置したまま動くビルドが作れてしまう。CI で tsc --noEmit を必ず通すか、noEmitOnError を有効にする | www.typescriptlang.org | |
| Node.js での直接実行の範囲 | Node.js 22.18.0 / 23.6.0 以降は型ストリッピングが既定で有効。型検査は行わず、tsconfig.json も読まない。enum・namespace・パラメータプロパティはエラーになり、import にはファイル拡張子(.ts)が必須 | 小さなスクリプトは tsc なしで動くが、型検査もパスエイリアスも効かない。アプリ本体は従来どおりビルド工程を持つ | nodejs.org | |
| Node.js のサポート期間 | 偶数版のみ LTS。Active LTS 12か月+Maintenance 18か月の計30か月。新メジャーは4月(偶数)と10月(奇数)の半年ごと | 奇数版を本番に使うと半年ほどでサポートが切れる。本番は偶数 LTS に固定し、約2年ごとに更新する | github.com | |
| TypeScript のリリース周期 | 約3か月ごとに新版。破壊的変更はベータ版までに入れ、ベータ以降は行わない方針 | 新版で型検査が厳しくなり、それまで通っていたコードにエラーが出ることがある。バージョンを固定し、更新は意図して行う | github.com |
典型的な落とし穴
- any を多用すると型検査の恩恵が消える。外部入力は unknown で受けて検証してから型を付ける
- strict を無効にしたまま始めると、後から有効化するときに大量のエラーが出る。最初から strict を有効にする
- ESM と CommonJS の混在(module 設定、.mts/.cts、拡張子の有無)で import が実行時に失敗する。実行環境とバンドラーの設定を揃える
- 依存パッケージの型定義(@types/*)と本体のバージョンがずれ、コンパイルが通らなくなる
コスト
- 課金モデル
- 無料
- 跳ねる条件
TypeScript は Apache License 2.0、Node.js は MIT License で無償。費用は動かすサーバーやホスティング側で発生する
- 出典
- github.com 検証
代替手段と差分
選定判断
ブラウザ画面を持つアプリ、フロントとサーバーで型を共有したい API、npm のライブラリを使う CLI では第一候補。型は実行時に消えるため外部入力の検証は別途必要で、CPU 負荷の高い並列処理や単一バイナリでの配布が要件なら Go へ
JavaScript の上位互換として型を足した言語で、コンパイル結果は素の JavaScript になる。ブラウザで動く唯一の言語と同じ文法でサーバー側(Node.js)も書けるため、Web アプリでは画面と API の型定義を1か所で共有できる点が最大の利点である。
最初に当たる制約は「型は実行時に存在しない」ことである。型を付けた変数に、API から違う形のデータが入っても TypeScript は何も検出しない。境界(HTTP、ファイル、環境変数)で実行時検証を挟む前提で設計する。次に当たるのが Node.js の版管理で、奇数版は短命、偶数 LTS でも30か月で切れるため、更新の計画が必要になる。