TypeScriptにおけるモジュール
この記事ではTypeScriptにおけるモジュールについて説明します。
YouTube Video
TypeScriptにおけるモジュール
TypeScriptにおけるモジュールは、コードの再利用性、保守性を向上させるための重要な機能です。JavaScriptと同様に、TypeScriptもECMAScript 2015(ES6)のモジュールシステムに基づいていますが、TypeScriptの型システムを活用できる点が大きな特徴です。
モジュールとは?
モジュールとは、関連するコードをひとつの単位にまとめ、他のファイルからインポートして再利用できる仕組みです。TypeScriptでは、ファイルごとにスコープが作成され、他のファイルに影響を与えないようにコードがカプセル化されます。これにより、コードの衝突を避け、保守しやすくなります。
内部モジュールと外部モジュール
- 内部モジュール(命名空間): TypeScript 1.5以前に使われていたモジュールの定義方法で、現在は推奨されていません。現在は「名前空間(namespace)」として扱われています。
- 外部モジュール: 現在の標準であり、ES6モジュールシステムに基づいています。ここでは主に外部モジュールについて解説します。
モジュールのエクスポート方法
モジュールを作成する際に、外部からアクセスできるようにするためにエクスポートが必要です。TypeScriptでは、export
キーワードを使って値や関数、クラスなどをエクスポートできます。主に次の2つのエクスポート方法があります。
名前付きエクスポート
複数のエクスポートを行う場合に使用され、インポート側で特定のものだけを選んで使用することができます。
1// mathUtils.ts
2export const pi: number = 3.14159;
3
4export function add(x: number, y: number): number {
5 return x + y;
6}
7
8export function subtract(x: number, y: number): number {
9 return x - y;
10}
デフォルトエクスポート
モジュール全体で一つのデフォルトのエクスポートを持たせたい場合に使用します。デフォルトエクスポートは名前を付けずにエクスポートされるため、インポート側では任意の名前で受け取れます。
1// calculator.ts
2export default class Calculator {
3 add(x: number, y: number): number {
4 return x + y;
5 }
6
7 subtract(x: number, y: number): number {
8 return x - y;
9 }
10}
モジュールのインポート方法
モジュールを利用する際は、import
キーワードを使ってモジュール内の値や関数、クラスなどをインポートします。
名前付きインポート
名前付きエクスポートから特定の要素をインポートする場合は、波括弧 {}
を使います。
1// main.ts
2import { pi, add, subtract } from './mathUtils';
3
4console.log(`Value of pi: ${pi}`);
5console.log(`Addition: ${add(10, 5)}`);
6console.log(`Subtraction: ${subtract(10, 5)}`);
デフォルトインポート
デフォルトエクスポートをインポートする場合は、任意の名前で受け取ります。
1// main.ts
2import Calculator from './calculator';
3
4const calculator = new Calculator();
5console.log(`Addition: ${calculator.add(10, 5)}`);
6console.log(`Subtraction: ${calculator.subtract(10, 5)}`);
インポートのエイリアス
名前の衝突を避けたり、長い名前を短くしたい場合には、エイリアス(別名)を付けてインポートできます。
1// main.ts
2import { add as addition, subtract as subtraction } from './mathUtils';
3
4console.log(`Addition: ${addition(10, 5)}`);
5console.log(`Subtraction: ${subtraction(10, 5)}`);
モジュールと名前空間の違い
名前空間(namespace
)は、TypeScriptの初期に使われていた内部モジュールの構造で、コードをグループ化するための方法です。しかし、現在ではES6モジュールが推奨されており、名前空間はほとんどの場合必要ありません。
名前空間は同一ファイル内や複数ファイルで定義でき、グローバルに展開されるため、依存関係の管理が難しくなることがあります。対照的にモジュールは、ファイルごとにスコープが分かれ、依存関係が明確であるため、よりモダンで安全な方法です。
1// Example of a namespace
2namespace Geometry {
3 export function calculateArea(radius: number): number {
4 return Math.PI * radius * radius;
5 }
6}
7
8// Can be used directly without importing the module (not recommended)
9const area: number = Geometry.calculateArea(5);
10console.log(`Area: ${area}`);
TypeScriptのモジュール解決
TypeScriptでは、モジュールの解決方法として2つの戦略を持っています。
- Nodeモジュール解決: Node.js環境で使われる標準の解決方法で、
node_modules
フォルダ内を探索してモジュールを解決します。 - Classicモジュール解決: TypeScript独自の解決方法で、より柔軟な探索を行いますが、現在ではあまり使われていません。
通常、Nodeモジュール解決が使用され、設定ファイルで指定しない限り、この方法がデフォルトで有効になります。
実践例
最後に、実際にモジュールを使って計算機能を実装し、再利用する例を示します。
mathUtils.ts
1export const pi: number = 3.14159;
2
3export function multiply(x: number, y: number): number {
4 return x * y;
5}
6
7export function divide(x: number, y: number): number {
8 if (y === 0) {
9 throw new Error("Cannot divide by zero");
10 }
11 return x / y;
12}
- このファイルは数学的なユーティリティ関数を定義し、再利用可能な基本的な数値演算関数を提供します。
calculator.ts
1import { multiply, divide } from './mathUtils';
2
3export default class Calculator {
4 multiplyNumbers(x: number, y: number): number {
5 return multiply(x, y);
6 }
7
8 divideNumbers(x: number, y: number): number {
9 return divide(x, y);
10 }
11}
- このファイルでは
Calculator
クラスを定義し、エクスポートしています。mathUtils
からインポートした関数を内部で使って計算機機能をカプセル化しています。
main.ts
1import Calculator from './calculator';
2
3const calculator = new Calculator();
4
5const result1: number = calculator.multiplyNumbers(10, 5);
6console.log(`Multiplication: ${result1}`);
7
8const result2: number = calculator.divideNumbers(10, 2);
9console.log(`Division: ${result2}`);
- このファイルはアプリケーションのエントリーポイントです。Calculator クラスのインスタンスを作成し、掛け算と割り算を実行してコンソールに出力します。
まとめ
TypeScriptのモジュールシステムは、コードを整理しやすく、再利用性や保守性を高めるための強力なツールです。ES6モジュールに基づいた外部モジュールの利用が推奨されており、export
やimport
キーワードを用いることで、モジュールのエクスポートとインポートが簡単に行えます。
YouTubeチャンネルでは、Visual Studio Codeを用いて上記の記事を見ながら確認できます。 ぜひYouTubeチャンネルもご覧ください。