【実務・中級編】 tsconfig.jsonの役割と基本構造 – TypeScript実践ガイド

`tsconfig.json` を制する者はプロジェクトを制す:現場で戦うための設定術

フロントエンドの現場で「なんとなく雛形をコピペして、エラーが出たらネットで見つけた設定を適当に書き足す」という開発、正直に言おう。それ、いつか必ず自分を苦しめることになるぞ。

TypeScriptのプロジェクトにおいて `tsconfig.json` は単なる設定ファイルではない。それは「このプロジェクトがどれだけ厳格であるか」「どれだけ型安全を守り抜く意志があるか」を表明する憲法だ。今回は、中級エンジニアが避けては通れない、この設定ファイルの「真の役割」と「現場で生き残るための黄金構成」を紐解いていく。

—

1. `tsconfig.json` はブラウザの「辞書」ではない

まず大前提を整理しよう。ブラウザはTypeScriptを理解できない。ブラウザが実行するのはあくまでJavaScriptだ。

`tsconfig.json` の最大の役割は、「TSという人間にとって読みやすい言語」を「ブラウザが解釈できるJS」に変換するための『翻訳ルール』を定義することだ。

  • コンパイラの挙動制御: どのファイルを見に行くのか(include)、どこを無視するのか(exclude)。
  • 型チェックの厳格度: どこまで厳しくコードを縛り上げるのか(strict)。
  • JSの出力形式: どのバージョンのJSで出力するか(target)、モジュールシステムはどうするか(module)。

この設定を疎かにすると、開発環境では動くのに、ビルドした途端に謎のランタイムエラーが噴出する……なんていう「現場の悲劇」が待っている。

—

2. 現場で「そのまま使える」黄金のベース構成

多くのプロジェクトで即座に採用できる、堅牢かつモダンな `tsconfig.json` を用意した。なぜこの設定なのか、一つずつ裏側を解説しよう。

{
“compilerOptions”: {
/ — 基本設定 — /
“target”: “ES2022”, // 最新のブラウザ環境を想定。ポリフィルは別途ツールで補うのが現代流
“module”: “ESNext”, // モジュール解決は最新の標準に任せる
“lib”: [“DOM”, “DOM.Iterable”, “ESNext”], // ブラウザAPIの型定義をロード

/ — 厳格さの極み(ここが最重要!) — /
“strict”: true, // 全ての「厳格モード」を有効化。これなしでTSを使う意味はない
“noUnusedLocals”: true, // 使っていない変数を許さない(クリーンなコードの第一歩)
“noUnusedParameters”: true, // 関数の引数も同様。無駄なコードを撲滅する
“noFallthroughCasesInSwitch”: true, // switch文の不意のフォールスルーを検知

/ — モジュール解決 — /
“moduleResolution”: “bundler”, // ViteやWebpack等のモダンなバンドラーに最適化
“esModuleInterop”: true, // CommonJSとESMの共存をスムーズにするための魔法
“skipLibCheck”: true, // node_modules内の型チェックをスキップし、ビルド時間を短縮する

/ — パスエイリアス — /
“baseUrl”: “.”,
“paths”: {
“@/”: [“src/”] // import { foo } from “@/utils/foo” と書けるようにする
}
},
“include”: [“src”], // src配下だけをコンパイル対象にする
“exclude”: [“node_modules”, “dist”] // ビルドに関係ないゴミは除外
}

—

3. なぜ「strict: true」から逃げてはいけないのか

中級者へのアドバイスとして、これだけは断言したい。`strict: false` で運用しているプロジェクトは、実質的に型のないJSを書いてるのと変わらない。

特に重要なのが以下のオプションだ。

  • `noImplicitAny`: `any` を暗黙的に許さない。これにより「意図しない `any`」が混入するのを防ぐ。
  • `strictNullChecks`: `null` や `undefined` を意識的に処理させる。現場で起きるランタイムエラーの8割はこれらを放置した結果だ。

最初は「型エラーがうるさすぎる!」と感じるかもしれない。だが、そのエラーこそが「将来の自分を救うための警告」なのだ。

—

4. チーフアーキテクトからのワンポイントアドバイス

現場でよくあるのが、後から「このオプションを有効にしたいけど、エラーが多すぎて直せない」という状況だ。そんなときは焦らず、以下の手順で進めるのがプロの流儀だ。

1. 段階的移行: `strict` を一度に有効にするのではなく、`noImplicitAny` など一つずつ有効にして、エラーを潰していく。
2. `// @ts-expect-error` を活用: どうしても修正に時間がかかる場所は、理由を明記して一時的に抑制する。ただし、これは「負債」だ。期限を決めて必ず解消すること。
3. `paths` の活用: プロジェクトが大きくなると `../../../../` のような惨状になる。`paths` を使ってパスの抽象化を行うだけで、コードの可読性と保守性は劇的に向上する。

—

まとめ

`tsconfig.json` は、プロジェクトの「健康診断書」のようなものだ。設定が甘ければ、コードは腐り、開発体験は低下し、バグの温床となる。

今日紹介した設定は、いわば「戦うための防具」だ。まずは自分のプロジェクトの `tsconfig.json` を開き、何が有効で、何が欠けているのかを見直してみてほしい。それが、君がチームを率いる次世代のアーキテクトへの第一歩になる。

何か設定で詰まったら、いつでも聞いてくれ。現場の泥臭い悩み、大歓迎だぞ。

コメント

タイトルとURLをコピーしました