2012-10-20 72 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 { 
    } 
}