2016-07-28 42 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 )。它建议使用这种方法 –

相关问题