かなり大きなバニラJavaScriptアプリケーション(より多くの消費者を含むフレームワーク)では、別注注入パターンを使用しています。このパターンでは、各JSモジュールがどのような依存関係を取るかを明示することができます。これは、主に2つの理由から有益です。モジュールのユニットテスト時に依存関係を簡単にスタブすることができ、実行時にモジュール実装を動的に置き換えることができます。JavaScriptの注入パターンをTypeScriptに変換できません
すべてのモジュールをTypeScriptに移行し始めましたが、カスタムタイプを公開するいくつかのモジュールを変換する際に問題が発生しました。問題は、TypeScriptがカスタムタイプを即座にエクスポートしたがっているように見えるが、実際には関数呼び出し(依存関係注入パターン)によってランタイム依存関係を提供した後にタイプをエクスポートしたいということです。
したがって、パターン自体を損なうことなく、次の注入パターンをどのようにタイプスクリプトに変換できますか?
module.exports = function ContextModule(logger) {
var log = logger.register('context');
function Context() {
log('creating type');
}
Context.prototype = {
doSomething: function() {
log('doing something');
}
}
Context.doSomethingStatic = function() {
log('doing something static');
}
return Context;
};
私たちは、カスタム型を返すと、我々がする必要があるときに、それを新しいことができます。例えば以下のように、我々は、main.js上記高度に不自然モジュールを構成するかもしれない:
- ロガーモジュールは、コンテキストに注入される:以下
var loggerModule = require('LoggerModule.js'); var contextModule = require('ContextModule.js'); logger = loggerModule(); var Context = contextModule(logger); // then we might use the Context type var context = new Context(); context.doSomething(); // instance method Context.doSomethingStatic(); // static method
注モジュール
- ロガーモジュールのメソッドは、ContextModule関数で直接、または定義している "クラス"実装で使用されます
- は、我々は彼らに結合するためにモジュールファイル「に必要」とbrowserifyするCommonJsを使用
お返事ありがとうございます。はい、私はJavaScriptのままにすることを検討していましたので、間違いなく、インターフェイスを作成するか、他のTypeScriptモジュールに挿入するだけです。私は、この作業をするためにTypeScriptにトリックがあるかどうかをもっと調べようとしていました。 Inversifyについては、これがフレームワークなので、他のライブラリへの依存を避けることができました。それでは、私は図書館をもっと詳しく調べます。ありがとう – David