この詳細な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
には、compilerOptions
、include
、exclude
などのオプションが含まれます。
必須のコンパイラオプション
compilerOptions
セクションはtsconfig.json
ファイルの中核です。TypeScriptコンパイラの動作を制御する幅広いオプションが含まれています。以下に、最も重要なコンパイラオプションのいくつかを紹介します。
target
target
オプションは、生成されるJavaScriptコードのECMAScriptターゲットバージョンを指定します。一般的な値にはES5
、ES6
(ES2015)、ES2016
、ES2017
、ES2018
、ES2019
、ES2020
、ES2021
、ES2022
、ESNext
があります。適切なターゲットを選択することは、ブラウザやNode.jsのバージョンなど、意図したランタイム環境との互換性を確保するために重要です。
例:
{
"compilerOptions": {
"target": "ES2020"
}
}
module
module
オプションは、モジュールコードの生成スタイルを指定します。一般的な値にはCommonJS
、AMD
、System
、UMD
、ES6
(ES2015)、ES2020
、ESNext
があります。モジュールシステムの選択は、ターゲット環境と使用するモジュールバンドラ(例:Webpack, Rollup, Parcel)に依存します。Node.jsではCommonJS
がよく使われますが、最新のWebアプリケーションでは、モジュールバンドラと組み合わせたES6
やESNext
が好まれます。ESNext
を使用すると、開発者は最新の機能と最適化を活用しつつ、最終的なモジュール形式の処理をバンドラに任せることができます。
例:
{
"compilerOptions": {
"module": "ESNext"
}
}
lib
lib
オプションは、コンパイルに含めるライブラリファイルのリストを指定します。これらのライブラリファイルは、組み込みのJavaScript APIやブラウザAPIの型定義を提供します。一般的な値にはES5
、ES6
、ES2015
、ES2016
、ES2017
、ES2018
、ES2019
、ES2020
、ES2021
、ES2022
、ESNext
、DOM
、WebWorker
、ScriptHost
、ES2015.Core
、ES2015.Collection
、ES2015.Iterable
、ES2015.Promise
、ES2015.Proxy
、ES2015.Reflect
、ES2015.Generator
、ES2015.Symbol
、ES2015.Symbol.WellKnown
、ES2016.Array.Include
、ES2017.object
、ES2017.Intl
、ES2017.SharedMemory
、ES2017.String
、ES2017.TypedArrays
、ES2018.Intl
、ES2018.Promise
、ES2018.RegExp
、ES2019.Array
、ES2019.Object
、ES2019.String
、ES2019.Symbol
、ES2020.BigInt
、ES2020.Promise
、ES2020.String
、ES2020.Symbol.WellKnown
、ES2021.Promise
、ES2021.String
、ES2021.WeakRef
、ES2022.Error
、ES2022.Object
、ES2022.String
など、他にも多数あります。適切なライブラリを選択することで、TypeScriptコンパイラがターゲット環境に必要な型情報を確実に持つようになります。DOMライブラリを使用すると、プロジェクトはブラウザ固有のAPIを使用するコードを型エラーなしでコンパイルできます。
例:
{
"compilerOptions": {
"lib": ["ES2020", "DOM"]
}
}
allowJs
allowJs
オプションは、TypeScriptコンパイラがTypeScriptファイルと一緒にJavaScriptファイルをコンパイルすることを許可します。これは、既存のJavaScriptプロジェクトを段階的にTypeScriptに移行するのに便利です。これをtrue
に設定すると、コンパイラが.js
ファイルを処理できるようになり、プロジェクト内でTypeScriptを徐々に採用できます。
例:
{
"compilerOptions": {
"allowJs": true
}
}
jsx
jsx
オプションは、JSX構文をどのように扱うかを指定します。一般的な値にはpreserve
、react
、react-native
、react-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がモジュールのインポートをどのように解決するかを指定します。一般的な値にはNode
とClassic
があります。Node
モジュール解決戦略がデフォルトであり、Node.jsのモジュール解決アルゴリズムに基づいています。Classic
モジュール解決戦略は古く、あまり使用されません。Node
モジュール解決戦略を使用することで、TypeScriptがNode.js環境でモジュールのインポートを正しく解決できるようになります。
例:
{
"compilerOptions": {
"moduleResolution": "Node"
}
}
baseUrl
and paths
baseUrl
とpaths
オプションは、非相対的なモジュールインポートのモジュール解決を設定するために使用されます。baseUrl
オプションは、非相対的なモジュール名を解決するためのベースディレクトリを指定します。paths
オプションを使用すると、モジュール名をファイルシステム上の特定の場所にマッピングできます。これらのオプションは、複雑なディレクトリ構造を持つプロジェクトや、モジュールのインポートを簡素化するのに特に便利です。baseUrl
とpaths
を使用すると、コードがより読みやすく、保守しやすくなります。
例:
{
"compilerOptions": {
"baseUrl": ".",
"paths": {
"@components/*": ["src/components/*"],
"@utils/*": ["src/utils/*"]
}
}
}
IncludeおよびExcludeオプション
include
とexclude
オプションは、どのファイルをコンパイルに含めるか、どのファイルを除外するかを指定します。これらのオプションは、ファイル名に一致させるためにグロブパターンを使用します。include
とexclude
を使用すると、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;
}
ベストプラクティス
- Strictモードを使用する:
strict
オプションを有効にして、型チェックを強化します。 - ターゲットを指定する: ランタイム環境に適した
target
バージョンを選択します。 - 出力を整理する:
outDir
を使用して、ソースコードとコンパイル済みコードを分離します。 - 依存関係を管理する:
include
とexclude
を使用して、コンパイルするファイルを制御します。 - Extendsを活用する:
extends
オプションで共通の設定を共有します。 - 設定をバージョン管理にチェックインする:
tsconfig.json
をgitにコミットして、開発者環境とCI/CDパイプライン全体で一貫性を維持します。
一般的な問題のトラブルシューティング
tsconfig.json
の設定は、時に困難な場合があります。以下に、一般的な問題とその解決策をいくつか示します。
モジュール解決の問題
モジュール解決エラーが発生した場合は、moduleResolution
オプションが正しく設定されていること、およびbaseUrl
とpaths
オプションが適切に設定されていることを確認してください。paths
オプションで指定されたパスが正しいことを再確認してください。必要なすべてのモジュールがnode_modules
ディレクトリにインストールされていることを確認してください。
型エラー
型定義が正しくないか、欠落している場合、型エラーが発生する可能性があります。使用しているすべてのライブラリに対して正しい型定義がインストールされていることを確認してください。型定義を持たないJavaScriptライブラリを使用している場合は、カスタム型定義の作成を検討してください。
コンパイルエラー
TypeScriptコードに構文エラーや型エラーがある場合、コンパイルエラーが発生する可能性があります。エラーメッセージを注意深く確認し、構文エラーや型エラーを修正してください。コードがTypeScriptのコーディング規約に従っていることを確認してください。
結論
適切に設定されたtsconfig.json
ファイルは、TypeScriptプロジェクトの成功に不可欠です。必須のコンパイラオプションと高度な設定を理解することで、開発ワークフローを最適化し、コードの品質を向上させ、ターゲット環境との互換性を確保できます。tsconfig.json
を適切に設定するために時間を投資することは、エラーを減らし、保守性を向上させ、ビルドプロセスを合理化することで、長期的には報われます。これにより、より効率的で信頼性の高いソフトウェア開発が実現します。ここで提供される情報は普遍的に適用可能であるように設計されており、TypeScriptで新しいプロジェクトを開始するための強固な基盤を提供するはずです。
利用可能なすべてのコンパイラオプションに関する最新情報と詳細な説明については、公式のTypeScriptドキュメントを参照することを忘れないでください。TypeScriptドキュメントは、TypeScript設定の複雑さを理解するための貴重なリソースです。