TypeScript模块

时间:2012-10-20 18:23:44

标签: module typescript

我想知道是否有可能在两个或更多文件中将两个或更多个类添加到TypeScript中的同一个模块中。像这样:

//src/gui/uielement.ts
module mylib {
    module gui {
        export interface UIElement {
            public draw() : void;
        }
    }
}

//src/gui/button.ts
///<reference path='uielement.ts'/>
module mylib {
    module gui {
        export class Button implements UIElement {
            constructor(public str : string) { }
            draw() : void { }
        }
    }
}

可能会有几十个GUI类,因此将它们全部放在同一个文件中是不可能的。我的所有课程都将在'mylib'模块中。 但是我该怎么做?

如果将module mylib {...}转换为函数,则所有文件中所有mylib块的所有内容都应包含在同一函数中。

这一切都可能吗?

当我编译时,我得到了这个:

$ tsc src/gui/button.ts 
src/gui/button.ts(4,39): The name 'UIElement' does not exist in the current scope

1 个答案:

答案 0 :(得分:22)

这正是它的工作原理!如果你查看生成的javascript代码,它会添加为一个接受一个对象的匿名函数,&#34;模块对象&#34;:

var mylib;
(function (mylib) {
    var Button = (function () {
        function Button(x) {
            this.x = x;
        }
        return Button;
    })();
    mylib.Button = Button;    
})(mylib || (mylib = {}));

如果查看最后一行(})(mylib || (mylib = {}));),只有当现有变量为false(或者计算结果为false,如null)时,才会看到它实例化一个新的ojbect(mylib = {})。 。 这样,所有&#34;模块&#34;命名相同的将合并到同一个对象。

因此,内部模块相互扩展。我必须指出,我还没有弄清楚嵌套模块会发生什么。

更新:如果我不使用嵌套模块语法,您的代码适用于我,但将其更改为点语法。 e.g:

module mylib.gui {
}

而不是

module mylib {
    module gui {
    }
}

我会尝试调查为什么会发生这种情况,只要我阅读规范,两种方式都应该是平等的。

更新:如果嵌套的引用模块被标记为已导出,则它可以工作:

module mylib {
    export module gui {
    }
}