TypeScript グローバル拡張解説
Node.jsにおいて、TypeScriptのグローバルオブジェクトを拡張することで、プロジェクト全体でアクセス可能な変数や関数を定義することができます。これは、共通の機能や設定を複数のファイルから利用したい場合に特に便利です。
方法
-
グローバルインターフェースの宣言
declare global { interface Global { myGlobalVariable: string; myGlobalFunction: () => void; } }
このコードブロックでは、
Global
インターフェースを拡張し、myGlobalVariable
とmyGlobalFunction
という新しいプロパティを追加しています。 -
グローバル変数の定義
// global.d.tsファイルなど declare global { namespace NodeJS { interface Global { myGlobalVariable: string; } } } // 他のファイルで利用 console.log(global.myGlobalVariable);
この方法では、
global.d.ts
ファイルにグローバルインターフェースを定義し、他のファイルからアクセスします。
注意点
- グローバル変数の値を変更した場合、その変更はプロジェクト全体に影響します。
- グローバル変数のスコープはプロジェクト全体に広がるため、意図しない副作用が生じる可能性があります。
- グローバル変数の過剰な使用は、コードの可読性や保守性を低下させる可能性があります。
代替案
- Dependency Injection
依存関係注入の原則に従って、必要なオブジェクトを関数やクラスに注入することで、グローバル変数の必要性を減らすことができます。 - 環境変数
プロジェクトの設定情報を環境変数として管理し、各ファイルからアクセスすることができます。 - モジュールシステム
グローバル変数ではなく、モジュールシステムを利用してコードを分割し、必要な機能をインポートすることで、よりモジュラーな構造を実現できます。
// global.d.ts
declare global {
interface Global {
myGlobalVariable: string;
myGlobalFunction: () => void;
}
}
このコードでは、global.d.ts
ファイル内にグローバルインターフェースGlobal
を宣言しています。このインターフェースは、myGlobalVariable
という文字列型のプロパティと、myGlobalFunction
という引数なしでvoidを返す関数のプロパティを定義しています。
例2: グローバル変数の定義と利用
// index.ts
declare global {
namespace NodeJS {
interface Global {
myGlobalVariable: string;
}
}
}
global.myGlobalVariable = 'Hello, world!';
// 他のファイルで利用
console.log(global.myGlobalVariable); // Output: Hello, world!
この例では、global.d.ts
ファイルにNodeJS
名前空間内のGlobal
インターフェースを拡張し、myGlobalVariable
プロパティを追加しています。その後、index.ts
ファイル内でこの変数に値を割り当て、他のファイルからアクセスしています。
Node.jsのモジュールシステム (CommonJSやES Modules) を活用することで、コードをモジュール化し、必要な機能をインポートすることでグローバル変数の必要性を減らすことができます。
// myModule.ts
export const myGlobalVariable = 'Hello, world!';
export function myGlobalFunction() {
console.log('Global function called');
}
// index.ts
import { myGlobalVariable, myGlobalFunction } from './myModule';
console.log(myGlobalVariable);
myGlobalFunction();
環境変数
環境変数は、プロジェクトの設定情報を外部から提供する手段です。Node.jsでは、process.env
オブジェクトを使用して環境変数にアクセスできます。
// index.ts
console.log(process.env.MY_GLOBAL_VARIABLE);
環境変数は、異なる環境(開発、テスト、本番)で異なる値を設定することができ、柔軟な構成が可能になります。
依存関係注入 (Dependency Injection)
依存関係注入は、オブジェクトの依存関係を明示的に注入することで、コードの結合度を下げる手法です。これにより、グローバル変数の必要性を減らすことができます。
// myService.ts
class MyService {
constructor(private readonly myGlobalVariable: string) {}
doSomething() {
console.log(this.myGlobalVariable);
}
}
// index.ts
const myService = new MyService('Hello, world!');
myService.doSomething();
node.js typescript global