TypeScript:从模块创建全局变量

时间:2013-11-05 15:24:27

标签: javascript global-variables typescript

我们正在使用TypeScript更新我们的网络应用程序,现在我们遇到了这个问题。这是我们的静态类MyModule.js:

MyModule = {};
MyModule.Constants = function(){};
MyModule.Constants.WIDTH = 100;
MyModule.Constants.HEIGHT = 100;
.......

现在我们将其更改为MyModule.ts:

module MyModule {
    export class Constants {
        public static WIDTH:number = 100;
        public static HEIGHT:number = 100;
        ....
    }
} 
export = MyModule;

这对我们来说很好,使用import / require语句,但是有一些我们无法改变的来自第三方的类(在javascript中),并且他们无法获取MyModule.Constants静态属性,因为MyModule对他们来说是不确定的。

那么无论如何都需要代码才能使MyModule和MyModule.Constants成为globar var?

1 个答案:

答案 0 :(得分:1)

假设您在浏览器中使用AMD模块:此处的难易程度取决于在处理脚本时是否必须为第三方代码定义MyModule,还是在调用某个特定函数之前。

如果第三方脚本加载正常,那么您的“main”需求语句是唯一需要更改的内容。 (主要是指单个入口点为RequireJS recommends。)您需要做的就是将MyModule添加到依赖项列表中并将其保存到全局对象中。

require(["MyModule", ...], function(MyModule, ...) {
    (<any>window).MyModule = MyModule;
    // the rest of your code
});
此处

window被强制转换为any,因此编译器不会抱怨该窗口.MyModule尚未定义。

如果没有定义MyModule,你的第三方脚本甚至无法加载,事情会变得更加困难。我认为最简单的解决方案是删除export = MyModule;行以使该脚本不是模块并单独/同步加载它。所以你的HTML文件会有这样的东西:

    <script type="text/javascript" src="scripts/MyModule.js"></script>
    <script type="text/javascript" src="thirdpartylib.js"></script>
    <script type="text/javascript" data-main="scripts/main" src="requirejs.js"></script>
    <!-- etc -->