Dan*_*nte 1 javascript namespaces typescript
默认情况下,这个Typescript代码
module Demo {
export class HelloWorld {
sayHello() {
return "Hello World";
}
}
}
Run Code Online (Sandbox Code Playgroud)
编译成以下Javascript
var Demo;
(function (Demo) {
var HelloWorld = (function () {
function HelloWorld() {
}
HelloWorld.prototype.sayHello = function () {
return "Hello World";
};
return HelloWorld;
})();
Demo.HelloWorld = HelloWorld;
})(Demo || (Demo = {}));
Run Code Online (Sandbox Code Playgroud)
这个Javascript命名空间模式是否有名称,在编写纯Javascript时是否可以使用它(例如,有没有更好的解决方案)?
非常如此.主要原因是它可以防止名称冲突.例如,考虑以下javascript代码:
function format(str){
// some dummy code
return str + " formatted";
}
function format(num){
// some dummy code
return num.toPrecision(10);
}
// beyond this point you cannot access format("str") version since it was replaced by format(number)
Run Code Online (Sandbox Code Playgroud)
使用打字稿内部模块,您可以这样做:
module stringUtils {
export function format(str:string){
// some dummy code
return str + " formatted";
}
}
module numberUtils{
export function format(num:number){
// some dummy code
return num.toPrecision(10);
}
}
stringUtils.format('some string');
numberUtils.format(123);
Run Code Online (Sandbox Code Playgroud)
此外,当您需要代码本地的私有函数时,它允许您防止全局命名空间污染,例如考虑这种情况:
module Utils{
// Cache and compiled the regex
// This regext is not very useful outside this module
var trimRegex = RegExp("^\s+|\s+$");
// This function is useful so we export it
export function trim(str:string) {
return str.replace(trimRegex,'');
}
}
// You cannot use trimRegex now.
// Your namespace is clean
// you can use Utils.trim though :)
Run Code Online (Sandbox Code Playgroud)
正如Steve Fenton所提到的,这种模式也在JavaScript中被广泛使用(称为自执行匿名函数).