2016-07-28 24 views
1

我將一個現有的AngularJS(1.x)項目移植到TypeScript,到目前爲止代碼正在工作,但我想知道爲什麼會發生這種情況。TypeScript編譯模塊在自動調用函數之前聲明var

在JavaScript中,我宣佈一個模塊,像這樣:

(function() { 
    'use strict'; 
    angular.module('myModule', []); 
})(); 

在打字稿,像這樣:

module myModule { 
    'use strict'; 
    angular.module('myModule', []); 
} 

這是編譯成這樣:

var myModule; 
(function (myModule) { 
    "use strict"; 
    angular.module("myModule", []); 
})(myModule || (myModule = {})); 

我有幾個疑點:

  1. 添加到全球範圍var myModule是否錯了?
  2. 爲什麼myModule被傳遞給匿名函數?
  3. 由於var myModule被添加,我不知道是否應該避免覆蓋。我將模塊聲明從Controller中分離出來。我想知道,當我宣佈控制器時,我應該使用不同的module名稱嗎?

換句話說,我可以重複使用相同的名稱爲第二模塊,像這樣

module myModule { 
    angular 
     .module('myModule') 
     .controller('myController'); 
} 
// which will "overwrite" the preexisting var myModule 

或者它會更好地使用其他名稱的模塊,像這樣:

module myModuleController { 
    angular 
     .module('myModule') 
     .controller('myController'); 
} 
// which will generate another var myModule 

我已經看到代碼工作得很好,但我確信在這件事情上我應該知道某些事情。

回答

0

它這樣做,那麼你就可以從其他地方訪問這個模塊,例如:

module ModuleA { 
    export var num = 4; 
} 

module ModuleB { 
    export function log() { 
     console.log(ModuleA.num); 
    } 
} 

然後你也可以添加更多的相同模塊:

module ModuleA { 
    export var num = 4; 
} 

module ModuleA { 
    export var str = "string"; 
} 

console.log(ModuleA.num); // 4 
console.log(ModuleA.str); // string 

在您的示例myModule中的已編譯的js正在傳遞,以便新定義將添加到現有模塊(如果有),否則將添加到現有模塊{}
在我(2日)例編譯JS是:

var ModuleA; 
(function (ModuleA) { 
    ModuleA.num = 4; 
})(ModuleA || (ModuleA = {})); 
var ModuleA; 
(function (ModuleA) { 
    ModuleA.str = "string"; 
})(ModuleA || (ModuleA = {})); 

正如你可以在第二次看到ModuleA不會是空的,所以加入了str變量將先前定義的模塊來完成。

請注意,此行爲,當你不使用的模塊系統是唯一真正的,比如這個:

export module ModuleA { 
    export var num = 4; 
} 

編譯成:

define(["require", "exports"], function (require, exports) { 
    "use strict"; 
    var ModuleA; 
    (function (ModuleA) { 
     ModuleA.num = 4; 
    })(ModuleA = exports.ModuleA || (exports.ModuleA = {})); 
}); 

(默認模塊系統)

+0

謝謝,更清晰:-)。有一個問題,因爲我在AngularJS中,我應該使用define嗎? – ghego1

+0

我不是一個有角度的開發人員,所以我無法從經驗中回答,但是作爲一個整體,JavaScript世界正在轉向模塊加載器。查看本文我發現:[AngularJS 1.x with TypeScript(或ES6)Best Practices](https://codepen.io/martinmcwhorter/post/angularjs-1-x-with-typescript-or-es6-best-practices )。它建議使用這種方法 –