ウェブサイト検索

node.js - node/typescript: 副作用のあるインポートを確実に実行するにはどうすればよいですか?


私はTypeScriptでNodeアプリを書いています。クラスデコレーター@myDecoratorを作成しました。@myDecoratorの目的は、それが適用されたすべてのクラスを追跡する必要があるということです。

私の質問:その動作を利用する前に、どうすればそれらすべてのデコレートされたクラスが読み込まれていることを確認できますか? より具体的にするために、いくつかの例コードが役立ちます:

  1. ファイル myDecorator.ts 内でのデコレーターの宣言:
type ConstructorType = { new (...args: any[]): any };

// keep track of decorated classes
const registeredClasses: Map<string, ConstructorType> = new Map();

// class decorator
export function myDecorator<T extends ConstructorType>(targetConstructor: T) {
  // create the modified class
  const newClass = class extends targetConstructor { /* ... */ }
  // register the modified class
  registeredClasses.set(targetConstructor.name, newClass);
  // and return it
  return newClass;
}

export function doSomethingWithMyDecoratedClasses() {
  //... some behavior that relies on `registeredClasses`
}
  1. ファイル someClass.ts でのデコレートされたクラスの宣言
import {myDecorator} from 'myDecorator.ts'

@myDecorator
class SomeClass { /* ... */ }
  1. 別のファイル anotherFile.ts で doSomethingWithMyDecoratedClasses を利用する:
import { doSomethingWithMyDecoratedClasses } from 'myDecorator.ts`
//...
doSomethingWithMyDecoratedClasses()
//...

問題は、doSomethingWithMyDecoratedClasses を呼び出す前に、SomeClass が registeredClasses に追加されていることを確認する必要があるということです。実際、私はアプリ内でこのようなクラスをいくつか書いており、それらがすべて登録されていることを確認する必要があります。

私の現時点での最良の理解では、anotherFile.ts 内で import 'someClass.ts' を呼び出す必要があります(実際、装飾されたクラスが宣言されているすべてのファイルをインポートする必要があります)、したがって実際には import someClass1.ts、import someClass2.ts などをインポートする必要があります

それが最善の方法/唯一の方法ですか?そうするために推奨されるパターンはありますか?

回答 #1

ほとんどのアプリケーションには、トップレベルのものをインポートする役割を持つインデックスファイルがあります。もしそこでdoSomethingWithMyDecoratedClassesをインポートすれば、他のすべてが先にインポートされることが保証されます。

別の方法としては、モジュールのルートレベルでそれを呼び出さず、代わりにイベントを待つことです。

関連記事