日本語

この詳細なtsconfig.jsonガイドでTypeScript設定をマスターしましょう。効率的な開発のために、必須のコンパイラオプション、プロジェクト設定、高度な構成を学びます。

TypeScript設定:tsconfig.json総合ガイド

JavaScriptのスーパーセットであるTypeScriptは、動的なWeb開発の世界に静的型付けをもたらします。適切に設定されたtsconfig.jsonファイルは、TypeScriptの能力を最大限に引き出すために不可欠です。このガイドでは、tsconfig.jsonの包括的な概要を提供し、必須のコンパイラオプション、プロジェクト設定、および高度な構成について説明します。

tsconfig.jsonとは?

tsconfig.jsonファイルは、TypeScriptプロジェクトのコンパイラオプションを指定する設定ファイルです。TypeScriptコンパイラに、TypeScriptコードをどのようにJavaScriptにトランスパイルするかを指示します。このファイルは、プロジェクトの構造を定義し、コンパイルルールを設定し、開発チーム全体(チームが単一のオフィスにいるか、複数の大陸に分散しているかに関わらず)での一貫性を確保するために不可欠です。

tsconfig.jsonファイルの作成

tsconfig.jsonファイルを作成するには、ターミナルでプロジェクトのルートディレクトリに移動し、次のコマンドを実行します。

tsc --init

このコマンドは、一般的に使用されるコンパイラオプションを含む基本的なtsconfig.jsonファイルを生成します。その後、プロジェクト固有の要件に合わせてファイルをカスタマイズできます。典型的なtsconfig.jsonには、compilerOptionsincludeexcludeなどのオプションが含まれます。

必須のコンパイラオプション

compilerOptionsセクションはtsconfig.jsonファイルの中核です。TypeScriptコンパイラの動作を制御する幅広いオプションが含まれています。以下に、最も重要なコンパイラオプションのいくつかを紹介します。

target

targetオプションは、生成されるJavaScriptコードのECMAScriptターゲットバージョンを指定します。一般的な値にはES5ES6 (ES2015)、ES2016ES2017ES2018ES2019ES2020ES2021ES2022ESNextがあります。適切なターゲットを選択することは、ブラウザやNode.jsのバージョンなど、意図したランタイム環境との互換性を確保するために重要です。

例:

{
  "compilerOptions": {
    "target": "ES2020"
  }
}

module

moduleオプションは、モジュールコードの生成スタイルを指定します。一般的な値にはCommonJSAMDSystemUMDES6 (ES2015)、ES2020ESNextがあります。モジュールシステムの選択は、ターゲット環境と使用するモジュールバンドラ(例:Webpack, Rollup, Parcel)に依存します。Node.jsではCommonJSがよく使われますが、最新のWebアプリケーションでは、モジュールバンドラと組み合わせたES6ESNextが好まれます。ESNextを使用すると、開発者は最新の機能と最適化を活用しつつ、最終的なモジュール形式の処理をバンドラに任せることができます。

例:

{
  "compilerOptions": {
    "module": "ESNext"
  }
}

lib

libオプションは、コンパイルに含めるライブラリファイルのリストを指定します。これらのライブラリファイルは、組み込みのJavaScript APIやブラウザAPIの型定義を提供します。一般的な値にはES5ES6ES2015ES2016ES2017ES2018ES2019ES2020ES2021ES2022ESNextDOMWebWorkerScriptHostES2015.CoreES2015.CollectionES2015.IterableES2015.PromiseES2015.ProxyES2015.ReflectES2015.GeneratorES2015.SymbolES2015.Symbol.WellKnownES2016.Array.IncludeES2017.objectES2017.IntlES2017.SharedMemoryES2017.StringES2017.TypedArraysES2018.IntlES2018.PromiseES2018.RegExpES2019.ArrayES2019.ObjectES2019.StringES2019.SymbolES2020.BigIntES2020.PromiseES2020.StringES2020.Symbol.WellKnownES2021.PromiseES2021.StringES2021.WeakRefES2022.ErrorES2022.ObjectES2022.Stringなど、他にも多数あります。適切なライブラリを選択することで、TypeScriptコンパイラがターゲット環境に必要な型情報を確実に持つようになります。DOMライブラリを使用すると、プロジェクトはブラウザ固有のAPIを使用するコードを型エラーなしでコンパイルできます。

例:

{
  "compilerOptions": {
    "lib": ["ES2020", "DOM"]
  }
}

allowJs

allowJsオプションは、TypeScriptコンパイラがTypeScriptファイルと一緒にJavaScriptファイルをコンパイルすることを許可します。これは、既存のJavaScriptプロジェクトを段階的にTypeScriptに移行するのに便利です。これをtrueに設定すると、コンパイラが.jsファイルを処理できるようになり、プロジェクト内でTypeScriptを徐々に採用できます。

例:

{
  "compilerOptions": {
    "allowJs": true
  }
}

jsx

jsxオプションは、JSX構文をどのように扱うかを指定します。一般的な値にはpreservereactreact-nativereact-jsxがあります。preserveはJSX構文を出力に残し、reactはJSXをReact.createElementの呼び出しに変換します。react-jsxはReact 17で導入された新しいJSX変換を使用し、Reactのインポートを必要としません。Reactや他のJSXベースのライブラリを使用するプロジェクトでは、正しいJSXオプションを選択することが重要です。

例:

{
  "compilerOptions": {
    "jsx": "react-jsx"
  }
}

declaration

declarationオプションは、各TypeScriptファイルに対応する.d.ts宣言ファイルを生成します。宣言ファイルには型情報が含まれており、他のTypeScriptプロジェクトがコンパイル済みコードを利用するために使用されます。宣言ファイルの生成は、再利用可能なライブラリやモジュールを作成するために不可欠です。これらのファイルにより、他のTypeScriptプロジェクトは、元のソースコードをコンパイルすることなく、ライブラリが公開する型やインターフェースを理解できます。

例:

{
  "compilerOptions": {
    "declaration": true
  }
}

sourceMap

sourceMapオプションは、生成されたJavaScriptコードを元のTypeScriptコードにマッピングするソースマップファイルを生成します。ソースマップは、ブラウザやその他の環境でTypeScriptコードをデバッグするために不可欠です。JavaScriptコードでエラーが発生した場合、ソースマップにより開発者はデバッガで対応するTypeScriptコードを見ることができ、問題の特定と修正が容易になります。

例:

{
  "compilerOptions": {
    "sourceMap": true
  }
}

outDir

outDirオプションは、生成されたJavaScriptファイルの出力ディレクトリを指定します。このオプションは、ソースコードとコンパイル済みコードを分離することで、プロジェクトのビルド出力を整理するのに役立ちます。outDirを使用すると、ビルドプロセスの管理とアプリケーションのデプロイが容易になります。

例:

{
  "compilerOptions": {
    "outDir": "dist"
  }
}

rootDir

rootDirオプションは、TypeScriptプロジェクトのルートディレクトリを指定します。コンパイラはこのディレクトリをモジュール名を解決するためのベースとして使用します。このオプションは、複雑なディレクトリ構造を持つプロジェクトにとって特に重要です。rootDirを正しく設定することで、コンパイラが必要なすべてのモジュールと依存関係を見つけられるようになります。

例:

{
  "compilerOptions": {
    "rootDir": "src"
  }
}

strict

strictオプションは、すべての厳格な型チェックオプションを有効にします。これは、開発プロセスの早い段階で潜在的なエラーを捉えるのに役立つため、新しいTypeScriptプロジェクトに強く推奨されます。strictモードを有効にすると、より厳格な型チェックルールが適用され、より堅牢で保守性の高いコードになります。すべての新しいTypeScriptプロジェクトでstrictモードを有効にすることがベストプラクティスです。

例:

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

esModuleInterop

esModuleInteropオプションは、CommonJSとESモジュール間の相互運用性を可能にします。これは、両方のタイプのモジュールを使用するプロジェクトにとって重要です。esModuleInteropを有効にすると、TypeScriptはCommonJSとESモジュールの違いを自動的に処理し、2つのシステム間でモジュールをインポート・エクスポートするのが容易になります。このオプションは、異なるモジュールシステムを使用する可能性のあるサードパーティライブラリを扱う際に特に便利です。

例:

{
  "compilerOptions": {
    "esModuleInterop": true
  }
}

moduleResolution

moduleResolutionオプションは、TypeScriptがモジュールのインポートをどのように解決するかを指定します。一般的な値にはNodeClassicがあります。Nodeモジュール解決戦略がデフォルトであり、Node.jsのモジュール解決アルゴリズムに基づいています。Classicモジュール解決戦略は古く、あまり使用されません。Nodeモジュール解決戦略を使用することで、TypeScriptがNode.js環境でモジュールのインポートを正しく解決できるようになります。

例:

{
  "compilerOptions": {
    "moduleResolution": "Node"
  }
}

baseUrl and paths

baseUrlpathsオプションは、非相対的なモジュールインポートのモジュール解決を設定するために使用されます。baseUrlオプションは、非相対的なモジュール名を解決するためのベースディレクトリを指定します。pathsオプションを使用すると、モジュール名をファイルシステム上の特定の場所にマッピングできます。これらのオプションは、複雑なディレクトリ構造を持つプロジェクトや、モジュールのインポートを簡素化するのに特に便利です。baseUrlpathsを使用すると、コードがより読みやすく、保守しやすくなります。

例:

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

IncludeおよびExcludeオプション

includeexcludeオプションは、どのファイルをコンパイルに含めるか、どのファイルを除外するかを指定します。これらのオプションは、ファイル名に一致させるためにグロブパターンを使用します。includeexcludeを使用すると、TypeScriptコンパイラによって処理されるファイルを制御でき、ビルドパフォーマンスを向上させ、エラーを削減できます。コンパイルに含めるファイルを明示的に指定することがベストプラクティスです。

例:

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

Extendsオプション

extendsオプションを使用すると、別のtsconfig.jsonファイルからコンパイラオプションを継承できます。これは、複数のプロジェクト間で共通の設定を共有したり、基本構成を作成したりするのに便利です。extendsオプションを使用すると、コードの再利用が促進され、重複が削減されます。基本構成を作成し、個々のプロジェクトでそれを拡張することがベストプラクティスです。

例:

{
  "extends": "./tsconfig.base.json",
  "compilerOptions": {
    "jsx": "react-jsx"
  },
  "include": ["src/**/*"]
}

高度な設定

必須のコンパイラオプションに加えて、tsconfig.jsonは特殊なシナリオ向けの高度な設定をサポートしています。

インクリメンタルコンパイル

大規模なプロジェクトでは、インクリメンタルコンパイルによってビルド時間を大幅に改善できます。TypeScriptは以前のコンパイル結果をキャッシュし、変更されたファイルのみを再コンパイルできます。インクリメンタルコンパイルを有効にすると、大規模プロジェクトのビルド時間を劇的に短縮できます。これは、多数のファイルと依存関係を持つプロジェクトにとって特に重要です。

{
  "compilerOptions": {
    "incremental": true,
    "tsBuildInfoFile": ".tsbuildinfo"
  }
}

プロジェクト参照

プロジェクト参照を使用すると、大規模なTypeScriptプロジェクトをより小さく、独立したモジュールに構造化できます。これにより、ビルド時間とコードの整理が改善されます。プロジェクト参照を使用すると、大規模プロジェクトがより管理しやすく、保守しやすくなります。大規模で複雑なプロジェクトにはプロジェクト参照を使用することがベストプラクティスです。

{
  "compilerOptions": {
    "composite": true
  },
  "references": [
    { "path": "./module1" },
    { "path": "./module2" }
  ]
}

カスタム型定義

時には、型定義を持たないJavaScriptライブラリに型定義を提供する必要がある場合があります。カスタム.d.tsファイルを作成して、これらのライブラリの型を定義できます。カスタム型定義を作成することで、型安全性を犠牲にすることなく、TypeScriptコードでJavaScriptライブラリを使用できます。これは、レガシーなJavaScriptコードや、独自の型定義を提供しないライブラリを扱う際に特に便利です。

// custom.d.ts
declare module 'my-library' {
  export function doSomething(x: number): string;
}

ベストプラクティス

一般的な問題のトラブルシューティング

tsconfig.jsonの設定は、時に困難な場合があります。以下に、一般的な問題とその解決策をいくつか示します。

モジュール解決の問題

モジュール解決エラーが発生した場合は、moduleResolutionオプションが正しく設定されていること、およびbaseUrlpathsオプションが適切に設定されていることを確認してください。pathsオプションで指定されたパスが正しいことを再確認してください。必要なすべてのモジュールがnode_modulesディレクトリにインストールされていることを確認してください。

型エラー

型定義が正しくないか、欠落している場合、型エラーが発生する可能性があります。使用しているすべてのライブラリに対して正しい型定義がインストールされていることを確認してください。型定義を持たないJavaScriptライブラリを使用している場合は、カスタム型定義の作成を検討してください。

コンパイルエラー

TypeScriptコードに構文エラーや型エラーがある場合、コンパイルエラーが発生する可能性があります。エラーメッセージを注意深く確認し、構文エラーや型エラーを修正してください。コードがTypeScriptのコーディング規約に従っていることを確認してください。

結論

適切に設定されたtsconfig.jsonファイルは、TypeScriptプロジェクトの成功に不可欠です。必須のコンパイラオプションと高度な設定を理解することで、開発ワークフローを最適化し、コードの品質を向上させ、ターゲット環境との互換性を確保できます。tsconfig.jsonを適切に設定するために時間を投資することは、エラーを減らし、保守性を向上させ、ビルドプロセスを合理化することで、長期的には報われます。これにより、より効率的で信頼性の高いソフトウェア開発が実現します。ここで提供される情報は普遍的に適用可能であるように設計されており、TypeScriptで新しいプロジェクトを開始するための強固な基盤を提供するはずです。

利用可能なすべてのコンパイラオプションに関する最新情報と詳細な説明については、公式のTypeScriptドキュメントを参照することを忘れないでください。TypeScriptドキュメントは、TypeScript設定の複雑さを理解するための貴重なリソースです。