TypeScript中的纯Javascript模块模式不会弄乱全局范围

TypeScript中的纯Javascript模块模式不会弄乱全局范围,javascript,typescript,design-patterns,module,Javascript,Typescript,Design Patterns,Module,我已经作为纯javascript的前端开发人员工作了一段时间。 正如您在下面的示例中所看到的,我已经习惯了模块模式。现在我从TypeScript开始,不可能得到相同的示例模式。我们的目标是获得一种名称空间,这样就不会破坏全局范围。 在TypeScript中实现相同目标的最佳方法是什么?谢谢 var myModulePattern=(函数(){ //私人物业-或多或少 变量 moduleName=“myModulePattern”, moduleAuthor=“Bob” ; //私有方法-或多或

我已经作为纯javascript的前端开发人员工作了一段时间。 正如您在下面的示例中所看到的,我已经习惯了模块模式。现在我从TypeScript开始,不可能得到相同的示例模式。我们的目标是获得一种名称空间,这样就不会破坏全局范围。 在TypeScript中实现相同目标的最佳方法是什么?谢谢

var myModulePattern=(函数(){
//私人物业-或多或少
变量
moduleName=“myModulePattern”,
moduleAuthor=“Bob”
;
//私有方法-或多或少
函数sayModuleHello(){
返回由“+moduleAuthor”生成的“模块”+moduleName+;
}
返回{
//公共财产
创建年份:2018年,
//公共方法
问候语:函数(){
log(“Hi:+sayModuleHello());
}
}
})();
//退出单独的对象文字,因此不可能创建“类”的另一个实例
//实际上,这就像是一个名称空间,不会弄乱全局范围
myModulePattern.greeting();

log(myModulePattern.createYear)我建议您使用文档中描述的typescript类

这正是我们的目的

namespace MyModule {
    // Private variables
    const moduleName = "myModulePattern";
    const moduleAuthor = "Bob";

    // Private functions
    function sayModuleHello() {
        return "Module " + moduleName + " made by " + moduleAuthor;
    }

    // Public properties
    export var createYear = 2018;
    // Public Methods
    export function greeting() {
        console.log("Hi: "+sayModuleHello());
    }
}

MyModule.greeting();
console.log(MyModule.createYear);

您可能还希望将模块放在自己的文件中,这样您就不再需要
名称空间
包装器了。

为什么推荐
?OP不需要多个实例。这是一个糟糕的建议。除了创建同一类型的多个实例时节省的内存外,类几乎在所有方面都是次等的。ES6模块难道不能满足您模块化的所有需求吗?如果有人想要模块模式的通用TypeScript实现(如Crockford所述),您可以看一看:bit.ly/2J4KJNX这是一个很好的答案。您也可以执行导出const createYear
而不是
var
@JamesMonger是的,我考虑过了,但是原始代码中的对象属性是可变的,所以我保留了它。@Bergi,非常感谢您的回答。这只是我一直在寻找的。但我的ts lint对名称空间提出了警告。名称空间的使用是不推荐的吗?@Casares我不知道。警告说什么?@Bergi,它说:[ts lint]“namespace”和“module”是不允许的(没有命名空间。这是我的开发环境(vs代码)中linter的tslint.json配置文件中的一条规则)。如果我继续,ts被编译并抛出addecuate js,那么一切都正常。我最关心的是名称空间现在是否被认为是良好的pract,或者它在类型脚本2.7中是不推荐的pract。谢谢
namespace MyModule {
    // Private variables
    const moduleName = "myModulePattern";
    const moduleAuthor = "Bob";

    // Private functions
    function sayModuleHello() {
        return "Module " + moduleName + " made by " + moduleAuthor;
    }

    // Public properties
    export var createYear = 2018;
    // Public Methods
    export function greeting() {
        console.log("Hi: "+sayModuleHello());
    }
}

MyModule.greeting();
console.log(MyModule.createYear);