12

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

1 回答 1

23

这正是它的工作原理!如果您查看生成的 javascript 代码,它会添加为接受对象的匿名函数,即“模块对象”:

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

如果您查看最后一行 ( ),您会发现它仅在现有变量为假(或评估为假的东西,如 null)})(mylib || (mylib = {}));时实例化一个新的 ojbect ( )。mylib = {}这样,所有命名相同的“模块”都将合并到同一个对象中。

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

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

module mylib.gui {
}

代替

module mylib {
    module gui {
    }
}

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

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

module mylib {
    export module gui {
    }
}
于 2012-10-20T19:31:31.830 回答