ゲームプログラミングにて、様々なステータスを引数で渡すことなくアクセスするためのFluxライクなライブラリを書いた。その際にグローバル変数を定義する必要があり、すこしハマったので調べたことをメモ。
グローバルな型定義を行うにはおなじみの.d.tsファイルを使用する。どこに設置しても良いが、今回は/types/index.d.tsに設置する。また、必ず@types/nodeを入れる必要がある。
index.d.tsファイルの内容は以下のような形。
import { State, Dispatcher } from '../src/xxx/State';
declare global {
namespace NodeJS {
interface Global {
state: State;
dispatcher: Dispatcher
}
}
}
declare global宣言でモジュールの型定義を拡張することができる。もちろんNodejsのglobalオブジェクトはNodeJS namespace内に定義されているため、それを拡張することになる。@types/nodeを必要とする理由はこのことから。
また、index.d.tsをtsconfig.jsonで明示的に読み込む必要がある。
{
"compilerOptions": {
...
"typeRoots": ["types"], // 型定義ファイルを設置したディレクトリ
"types": ["node"],
...
}
}
これでglobalオブジェクトを使用する準備ができた。あとはコードを書けばコンパイルできる。
global.dispatcher = new Dispatcher();
global.dispatcher.dispatch('your_event');
以上です。
コメントを残す