我們在一個相當大的vanilla JavaScript應用程序中使用定製的注入模式(更多的框架與許多消費者)。該模式允許我們明確每個JS模塊所依賴的依賴關係。這有兩個主要原因:在單元測試模塊時很容易依存,並且允許我們的客戶在運行時動態替換模塊實現。無法將JavaScript注入模式轉換爲TypeScript
我們已經開始將我們所有的模塊遷移到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函數中,或者直接用於定義的「類」實現中
- 我們使用CommonJS的爲「需要」的模塊文件和browserify把它們結合起來
感謝您的回覆。是的,我一直在考慮將其留在JavaScript中,這絕對是一個後備 - 可能只是創建一個接口,或者當我們將其注入到其他TypeScript模塊。我更想確定在TypeScript中是否有一個技巧來完成這項工作。 至於Inversify,因爲這是一個框架,我們避免了依賴於其他庫。也就是說,我會更詳細地檢查圖書館。謝謝 – David