ウェブエンジニア問題集
第11章

tsconfig.jsonの読み方

7
この章の目次開く

tsconfig.json はTypeScriptプロジェクトの設定ファイルです。オプションが多く初見では圧倒されますが、実務で重要なものは限られています。

学習者学習者

tsconfig.json のオプションが多すぎて開く気が失せる…。全部理解しないとダメ?

先生先生

全部覚える必要はない。まず strict を有効にして、あとはプロジェクトで問題が出たときにピンポイントで調べれば十分だよ。

strictモード — まずこれを有効にする

strict: true は、複数の厳格チェックをまとめて有効にするフラグです。

{
  "compilerOptions": {
    "strict": true
  }
}
json

strict: true が有効にする主要オプション:

オプション何をチェックするか
strictNullChecksnull / undefined を型レベルで区別する
noImplicitAny型推論できないものに暗黙の any を禁止する
strictFunctionTypes関数の引数型を厳密にチェックする
strictPropertyInitializationclassプロパティの初期化漏れを検出する
// strictNullChecks: true の場合
function greet(name: string | null) {
  // ❌ name.toUpperCase(); // Object is possibly 'null'
  // ✅
  if (name) {
    name.toUpperCase();
  }
}
 
// noImplicitAny: true の場合
// ❌ function process(data) {} // Parameter 'data' implicitly has an 'any' type
// ✅
function process(data: unknown) {}
typescript

target と module — 出力するJSの形式

{
  "compilerOptions": {
    "target": "ES2022",
    "module": "ESNext"
  }
}
json
オプション決めることよくある値
targetコンパイル先のJSバージョンES2020, ES2022, ESNext
module出力するモジュール形式ESNext, CommonJS, Node16

target を低くすると、async/await がジェネレータに変換されるなど出力が複雑になります。モダンブラウザやNode.js 18+なら ES2022 以上で問題ありません。

学習者学習者

targetmodule の違いがよく分からない…。どちらもES何とかを指定するけど何が違うの?

先生先生

target は「どのバージョンのJSに変換するか」で、module は「import/exportをどの形式で出力するか」。Next.jsやViteならフレームワークが適切なデフォルトを設定してくれるから、そのまま使えばOK。

moduleResolution — importの解決方法

{
  "compilerOptions": {
    "moduleResolution": "bundler"
  }
}
json
使う場面
node従来のNode.js(CommonJS中心)
node16 / nodenextNode.js 16+のESM対応
bundlerVite, Next.js, webpackなどバンドラー経由

bundler はバンドラーが解決してくれる前提で、拡張子なしの importpackage.jsonexports フィールドを柔軟に扱います。フロントエンド開発では bundler が推奨されています。

paths と baseUrl — パスエイリアス

{
  "compilerOptions": {
    "baseUrl": ".",
    "paths": {
      "@/*": ["./src/*"]
    }
  }
}
json

これで import { Button } from '@/components/Button' のようなエイリアスが使えます。

include と exclude

{
  "include": ["src/**/*", "types/**/*"],
  "exclude": ["node_modules", "dist"]
}
json

include に指定したパターンに一致するファイルだけがコンパイル対象になります。excludeinclude の結果からさらに除外するファイルを指定します。

フレームワークのtsconfig

Next.jsやViteは、プロジェクト作成時にtsconfigを自動生成します。

// Next.js が生成する tsconfig.json(抜粋)
{
  "compilerOptions": {
    "target": "ES2017",
    "lib": ["dom", "dom.iterable", "esnext"],
    "module": "esnext",
    "moduleResolution": "bundler",
    "jsx": "preserve",
    "strict": true,
    "paths": {
      "@/*": ["./src/*"]
    }
  }
}
json
tsconfigを読む
フレームワークが生成したtsconfigは、まず触らず意味を理解してから変更する

フレームワークが生成したtsconfigは理由があってその値になっているため、意味が分からないまま変更すると問題が起きやすいです。変更するときは、そのオプションが何を制御しているかを確認してから行います。

実務でよく変更するオプション一覧

オプション用途よくある変更
strict厳密な型チェック新規は true、レガシーは段階的に
targetJS出力バージョン環境に合わせて ES2022 以上
pathsパスエイリアス@/* を追加
skipLibCheck.d.ts のチェック省略ビルド高速化のため true
noUncheckedIndexedAccess配列・オブジェクトのアクセスに undefined を含める安全性を上げるなら true
verbatimModuleSyntaximport type の明示を強制バンドルサイズ最適化

ちゃんと使うためのポイント

  • まず strict: true を有効にする。新規プロジェクトでは必須
  • フレームワーク生成のtsconfigは理解してから変更する
  • moduleResolution: "bundler" がフロントエンド開発の現在の推奨
  • paths の設定はTypeScriptだけでなくバンドラー側も合わせる
  • 困ったときは公式ドキュメントのTSConfig Referenceを確認する

参考リンク

TypeScriptクイズに挑戦するこの章で学んだTypeScriptの知識を、4択クイズでアウトプットして定着させよう