我想知道是否有可能在两个或更多文件中将两个或更多个类添加到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
答案 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 {
}
}