2016-10-26 29 views
0

我們在一個相當大的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把它們結合起來

回答

0

所以,問題是我們如何能夠轉換以下注塑模式而不會影響模式本身

以打字稿

你可以肯定地使用它(JavaScript是有效的TypeScript)。如果你想要安全,將注入框架轉換爲TypeScript成語的過程將比僅使用爲其設計的過程更加困難。

我強烈推薦https://github.com/inversify/InversifyJS

+0

感謝您的回覆。是的,我一直在考慮將其留在JavaScript中,這絕對是一個後備 - 可能只是創建一個接口,或者當我們將其注入到其他TypeScript模塊。我更想確定在TypeScript中是否有一個技巧來完成這項工作。 至於Inversify,因爲這是一個框架,我們避免了依賴於其他庫。也就是說,我會更詳細地檢查圖書館。謝謝 – David