02. 実行環境

検査する道具と、実行する道具は別 / 手元で .ts が動く状態を作る

📅 作成: 2026-08-29 / 更新: 2026-08-29

この章の到達点

この章の内容

  1. 動かす方法は4つある
  2. tsc — 検査する道具
  3. その場で実行する — tsx・node・bun・deno
  4. npm と型定義(@types)
  5. エディタと言語サーバ

02.1 動かす方法は4つある

「検査する」と「実行する」は別の仕事

01. 背景で見たとおり、tsc の仕事は型を検査すること型を取り除いた JavaScript を出力することの2つでした。実行はしません。

一方、手元で動かすだけなら tsc を通さない道具もあります。それらは型を検査しません。型注釈を捨てて実行するだけです。

道具型を検査する実行する使いどころ
tscするしない検査と、配布用 JavaScript の生成
tsxしないする開発中にすぐ動かす。制約が少ない
nodeしないする道具を増やさず動かす。使えない構文がある
bun / denoしない/一部するするNode 以外の処理系を使う場合

実行できたことは、型が正しいことを意味しません。

tsxnode も型注釈を捨てるだけで、内容を見ていません。型エラーがあっても平然と動きます。検査は tsc かエディタが行います。この分担を混同すると、「動いているのにビルドが通らない」という状況の理由が分からなくなります。

main.ts 型注釈あり tsc 検査 + 出力 型エラーの報告 main.js node 実行結果 tsx / node / bun 型注釈を取り除いて実行 実行結果 こちらの経路では型エラーがあっても止まらない 検査してから そのまま
図 1 — 検査する経路と、そのまま実行する経路。tsxnode は型を見ない

この資料での使い分け

場面使うもの
コード例を動かすnpx tsx ファイル名.ts
型エラーを確かめるnpx tsc --noEmit、またはエディタの波線
出力される JavaScript を見るnpx tsc

コード例は実ファイルで用意してあります

この資料に出てくるコード例は、docs/samples/ に実ファイルとして置いてあります。写経せずに動かしたい場合はこちらを使ってください。

$ cd docs/samples
$ npm i

$ npx tsx 04-null-check.ts    # 個別に実行する
$ npx tsc                     # 全ファイルをまとめて型検査する

ファイル名は 04-null-check.ts のように資料番号が接頭辞になっています。読んでいる章に対応するファイルがすぐ見つかります。

02.2 tsc — 検査する道具

導入する

プロジェクトごとに入れます。グローバルに入れると、プロジェクトごとにバージョンを変えられません。

$ npm init -y
$ npm i -D typescript tsx

$ npx tsc --version
Version 7.0.2

検査だけする — --noEmit

tsc は既定で JavaScript を出力します。検査だけしたいときは --noEmit を付けます。

$ npx tsc --noEmit greet.ts
greet.ts:7:21 - error TS2353: Object literal may only specify known properties,
                              and 'namae' does not exist in type 'User'.

7 console.log(greet({ namae: "Alice" }));
                      ~~~~

Found 1 error in greet.ts:7

エラーがなければ何も出力しません。「何も出ない = 合格」です。

設定ファイルとコマンドライン引数は併用できない

TS7 tsconfig.json がある状態でコマンドラインにファイル名を指定すると、tsconfig.json は読み込まれません。TypeScript 7 はこれをエラーで教えてくれます。

$ npx tsc --noEmit fs-test.ts
error TS5112: tsconfig.json is present but will not be loaded if files are
              specified on commandline. Use '--ignoreConfig' to skip this error.

訳: tsconfig.json がありますが、コマンドラインでファイルを指定すると読み込まれません。
    このエラーを飛ばすには '--ignoreConfig' を使ってください。

この挙動は TypeScript 5 系でも同じですが、警告が出ません。

5 系では黙って tsconfig.json を無視するため、「設定したはずのオプションが効かない」という形で現れます。プロジェクト全体を検査するときは、ファイル名を指定せず npx tsc だけを実行してください。

設定を作る

tsconfig.json の雛形は次のコマンドで作れます。中身は 03. tsconfig で扱います。

$ npx tsc --init

02.3 その場で実行する — tsx・node・bun・deno

tsx — 制約が少ない

tsx は型注釈を取り除いて実行します。この資料のコード例はすべて tsx で動きます。

$ npx tsx hello.ts
Hello, TypeScript!

node — 道具を増やさずに動かす

Node型ストリップ 新しい Node は .ts をそのまま実行できます。型注釈を取り除いてから実行する仕組み(type stripping)が入っているためです。

$ node --version
v26.8.1

$ node hello.ts
Hello, TypeScript!

使えない構文がある

Node の型ストリップは「取り除く」だけで、変換はしません。そのため、JavaScript のコードを生成する必要がある構文は使えません。

// enum-test.ts
enum Color { Red, Green, Blue }
const c: Color = Color.Green;
console.log(Color[c]);
$ node enum-test.ts
SyntaxError [ERR_UNSUPPORTED_TYPESCRIPT_SYNTAX]:
  TypeScript enum is not supported in strip-only mode

訳: TypeScript の enum は、取り除くだけのモードでは対応していません。

enum は型ではなく実行時のオブジェクトを生成するため、取り除くだけでは成立しません。同じ理由で、クラスのパラメータプロパティも使えません。

// param-prop.ts
class User {
	constructor(public name: string) {}   // ← public が代入コードを生む
}
$ node param-prop.ts
SyntaxError [ERR_UNSUPPORTED_TYPESCRIPT_SYNTAX]:
  TypeScript parameter property is not supported in strip-only mode

訳: TypeScript のパラメータプロパティは、取り除くだけのモードでは対応していません。
構文nodetsx理由
型注釈・interfacetype使える使える取り除くだけで済む
enum使えない使える実行時のオブジェクトを生成する
パラメータプロパティ使えない使える代入コードを生成する
namespace使えない使える同上

この制約は、むしろ推奨される書き方に沿っています。

enumnamespace は「JavaScript に何も足さない」という TypeScript の設計方針の例外にあたる機能で、現在は使用を避けるのが一般的です。enum の代わりに何を使うかは 04. 型の基本 で扱います。

bun と deno

Node 以外の処理系も .ts をそのまま実行できます。

$ bun --version
1.4.0
$ bun run hello.ts
Hello, TypeScript!

$ deno --version
deno 1.31.1 (release, x86_64-pc-windows-msvc)
$ deno run hello.ts
Hello, TypeScript!

bunenum も実行できます(取り除くだけでなく変換するため)。この資料は Node を前提に進めますが、コード例は bun・deno でもそのまま動きます。

02.4 npm と型定義(@types)

型定義はライブラリとは別に配られることがある

JavaScript のライブラリには型がありません。TypeScript から使うには型定義ファイル(.d.tsが必要です。

型定義の在り処説明
ライブラリに同梱何もしなくても型が付く。最近のライブラリはこれが多いzodhono
@types/*有志が書いた型定義を別途入れる(DefinitelyTyped)@types/node@types/express
存在しない自分で書くか、unknown で受ける(10古いライブラリ
ライブラリを使いたい ① ライブラリに同梱 何もしなくても型が付く package.json の "types" ② @types/* を入れる npm i -D @types/node + tsconfig の types に列挙 ③ 型定義が存在しない 自分で .d.ts を書く またはラッパーで包む 最近のライブラリはこれが多い Node の標準 API もここ 10 モジュールで扱う
図 2 — 型定義の入手経路は3つ。どれに当たるかで対処が変わる

Node の標準 API にも型定義が要る

node:fs のような標準モジュールも、型定義は別途入れます。入れないとこうなります。

// fs-test.ts
import { readFileSync } from "node:fs";
const s = readFileSync("package.json", "utf8");
$ npx tsc
fs-test.ts(1,30): error TS2591: Cannot find name 'node:fs'.
  Do you need to install type definitions for node?
  Try `npm i --save-dev @types/node` and then add 'node' to the types field in your tsconfig.

訳: 'node:fs' という名前が見つかりません。node の型定義を入れる必要がありますか。
    `npm i --save-dev @types/node` を実行し、tsconfig の types に 'node' を追加してください。
$ npm i -D @types/node

TypeScript 7 では types への明示が必要

TS7 @types/node を入れるだけでは足りません。tsconfig.jsontypes"node" を書く必要があります。

{
	"compilerOptions": {
		"target": "es2022",
		"module": "nodenext",
		"moduleResolution": "nodenext",
		"strict": true,
		"types": ["node"]        // ← TypeScript 7 では必須
	}
}

TypeScript 5 系では types を書かなくても通ります。

5 系は node_modules/@types/ 配下を自動で読み込んでいました。7 では明示が必要です。「5 では通っていたコードが 7 で TS2591 になる」のはこれが原因です。エラーメッセージ自身が types への追加を促しているので、指示どおりに直せば解決します。

devDependencies に入れる

型定義は開発中にしか使いません(実行時には消えているため)。-D--save-dev)で入れます。

$ npm i -D typescript tsx @types/node

02.5 エディタと言語サーバ

波線を出しているのは tsc ではない

エディタが型エラーを波線で示すのは、TypeScript の言語サーバ(tsserver)が裏で動いているためです。tsc とは別のプロセスですが、同じ TypeScript のコードを使っています。

エディタとコマンドラインで結果が違うとき

「エディタは赤いのに tsc は通る」「その逆」が起きたら、ほぼ確実にバージョンか設定の食い違いです。

症状疑うところ
エディタだけエラーが出る/出ないエディタが使っている TypeScript のバージョン。VS Code は既定で同梱版を使う。プロジェクトの版に切り替える
特定のファイルだけ型が付かないtsconfig.jsoninclude / exclude から漏れている
設定を変えても反映されない言語サーバの再起動が必要(VS Code: TypeScript: Restart TS Server
コマンドラインだけエラーが出るファイル名を指定して tsconfig.json が無視されている(02.2

VS Code のバージョンをプロジェクトのものに合わせます。

.ts を開いた状態で、コマンドパレットから TypeScript: Select TypeScript Version →「Use Workspace Version」を選びます。これをしないと、チーム内で人によってエラーの出方が変わります

動作確認の3点

この先の章を読む前に、次の3つが通ることを確かめてください。

$ node --version                    # LTS 以降であること
$ npx tsx --version                 # 実行できること
$ npx tsc --noEmit                  # 検査が動くこと

エディタで .ts を開き、わざと const n: number = "文字列"; と書いて波線が出ることも確認してください。出なければ、この先のコード例で「エラーになるはず」の箇所が確認できません。