tsconfig.json 推奨構成(2026年版)

TypeScript 6.0で多くのデフォルト値が変更され、設定がシンプルになりました。 以下は2026年の新規プロジェクト向け推奨構成です。

{
  "compilerOptions": {
    // TypeScript 6.0 からデフォルトで有効
    "strict": true,              // 全strictオプション一括有効化
    "target": "es2025",          // 6.0の新デフォルト
    "module": "esnext",          // 6.0の新デフォルト
    "moduleResolution": "bundler", // Vite/Next.js使用時

    // 追加推奨(6.0デフォルトに含まれない)
    "noUncheckedIndexedAccess": true,   // 配列・オブジェクトのアクセスにundefined追加
    "exactOptionalPropertyTypes": true, // ?プロパティの厳密化
    "noImplicitOverride": true,         // override キーワード必須化
    "noFallthroughCasesInSwitch": true, // switch文のフォールスルー禁止
    "verbatimModuleSyntax": true,       // import/export文をそのまま出力
    "erasableSyntaxOnly": true,         // Node.js native TS対応の準備

    // 出力
    "outDir": "dist",
    "declaration": true,
    "declarationMap": true,
    "sourceMap": true,
    "skipLibCheck": true
  },
  "include": ["src"]
}

strict モード全解説

strict: trueを有効にすると、以下の8つのオプションが一括で有効化されます。 TypeScript 6.0からはデフォルトでtrueです。

オプション効果検出できるバグ
noImplicitAny暗黙のany型をエラーに型なし関数引数、不正確な推論
strictNullChecksnull/undefinedを明示的に扱うCannot read property of null/undefined
strictFunctionTypes関数パラメータの型を厳密チェックコールバックの型不一致
strictBindCallApplybind/call/applyの引数型チェック動的呼び出しの型不整合
strictPropertyInitializationクラスプロパティの初期化漏れ検出undefinedアクセス
noImplicitThisthisの型が不明な場合にエラーthisの暗黙的なany
alwaysStrict全ファイルにJS strict mode付与JS strictモードのバグ防止
useUnknownInCatchVariablescatch変数をunknown型にエラーオブジェクトの誤った型仮定

Enum vs as const — 現代の選択

TypeScriptのenumは、設計目標「式レベルの構文追加を最小限に」に反する例外的な存在です。 ランタイムにJavaScriptコードを生成し、Tree-shakingが効きにくく、Node.jsの型ストリッピング(--strip-types)でもサポートされません。

観点enumas const + typeof
ランタイムコード生成する(逆引きマッピング等)JavaScriptオブジェクトのみ
Tree-shaking効きにくい通常通り動作
Node.js native TS非対応対応
型の柔軟性限定的ユニオン型として自由に利用可能
数値代入の安全性任意の数値が代入可能(穴あり)リテラル型で厳密に制限
// ❌ 旧スタイル: enum
enum Status {
  Active = "ACTIVE",
  Inactive = "INACTIVE",
  Pending = "PENDING",
}

// 数値enumの落とし穴
enum Direction { Up, Down, Left, Right }
const d: Direction = 999; // エラーにならない!

// ✅ 現代スタイル: as const + typeof
const Status = {
  Active: "ACTIVE",
  Inactive: "INACTIVE",
  Pending: "PENDING",
} as const;

type Status = (typeof Status)[keyof typeof Status];
// "ACTIVE" | "INACTIVE" | "PENDING"

// ランタイムオブジェクトとしてもユニオン型としても使える
function processStatus(status: Status) {
  if (status === Status.Active) {
    // ...
  }
}

moduleResolution — 正しい設定の選び方

用途特徴
bundlerVite, Next.js, Webpack等package.json の exports を尊重。拡張子不要
node16 / nodenextNode.js ライブラリESM/CJS両対応。拡張子必須
node(旧式)レガシー用途のみexports 非対応。非推奨
classic(旧式)TypeScript 1.x互換TS 7.0で削除予定
graph TD
  A{プロジェクトの種類は?} -->|Vite / Next.js / Webpack| B[bundler]
  A -->|Node.js ライブラリ| C[node16 / nodenext]
  A -->|Deno / Bun| D[bundler でOK]
  A -->|レガシープロジェクト| E[node(移行推奨)]

  style A fill:#eab308,stroke:#ca8a04,color:#000
  style B fill:#22c55e,stroke:#16a34a,color:#fff
  style C fill:#22c55e,stroke:#16a34a,color:#fff
  style D fill:#22c55e,stroke:#16a34a,color:#fff
  style E fill:#ef4444,stroke:#dc2626,color:#fff
moduleResolution の選び方 — プロジェクトの種類で決まる

初心者が詰まるポイント TOP10

#落とし穴対策
1anyの乱用unknown + 型ガードを使う
2型アサーション(as)の多用satisfiesや型ガードで代替
3strictNullChecksを無効にするプロジェクト開始時からstrict: trueで
4オブジェクト型にobjectを使う具体的なインターフェースを定義する
5過度なジェネリクス型パラメータが2箇所以上で使われるか確認
6interfacetypeの混乱オブジェクト型はinterface、それ以外はtype
7moduleResolution: nodeを使い続けるbundlerまたはnode16に移行
8値と型の名前空間を混同typeofで値から型を取得
9@ts-ignoreの多用@ts-expect-errorを使う(エラーが解消されたら教えてくれる)
10型定義ファイル(@types/*)の入れ忘れnpm i -D @types/xxxを忘れずに

Declaration Files (.d.ts) — 型の橋渡し

.d.tsファイルは型宣言のみを含み、実行時コードは含みません。 JavaScriptライブラリにTypeScriptの型情報を提供する「橋渡し」の役割を果たします。

// types/my-untyped-lib.d.ts
// 型定義のないJSライブラリに型を付ける
declare module "my-untyped-lib" {
  export function doSomething(input: string): number;
  export interface Config {
    verbose: boolean;
    timeout: number;
  }
}

// 使用側
import { doSomething } from "my-untyped-lib";
const result = doSomething("hello"); // number型として推論される

理解度チェック

問題 0 / 50%
Q1

TypeScript 6.0 からの strict オプションのデフォルト値はどれですか?

キーボード: 1〜4 で選択、Enter で回答