2012-10-20 75 views
12

我想知道是否有可能以某种方式在两个或多个文件中添加两个或多个文件到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 
+0

是的,这是支持的。不知道你为什么不试试它。 –

+0

我做到了。对不起,没有解释我得到的错误...将进一步描述。 –

回答

22

这是它是如何工作的!如果你看一下生成的JavaScript代码,将其添加为接受对象的匿名函数中,“模块对象”:

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

如果你看看最后一行(})(mylib || (mylib = {}));),你看到它实例化新的ojbect(mylib = {})只有当现有变量为false(或者评估为false的东西,如null)。 这样,所有名称相同的“模块”将被合并到同一个对象中。

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

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

module mylib.gui { 
} 

,而不是

module mylib { 
    module gui { 
    } 
} 

我会尽力在为什么发生这种情况进行调查,据我已经阅读了规范,这两种方式应该是平等的。

更新:如果为导出的嵌套引用模块标记,它的工作原理:

module mylib { 
    export module gui { 
    } 
}