TypeScript 模块

2024-04-13

我想知道是否有可能以某种方式将两个或多个文件中的两个或多个类添加到 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”模块中。 但我该怎么做呢?

If the module mylib {...}被翻译成一个函数然后所有的内容mylib所有文件中的块应包含在同一函数中。

这是可能吗?

当我编译时我得到这个:

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

这就是它的工作原理!如果你查看生成的 JavaScript 代码,它会添加一个接受对象的匿名函数,即“模块对象”:

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

如果你看最后一行(})(mylib || (mylib = {}));)你看到它实例化了一个新对象(mylib = {})仅当现有变量为 false(或计算结果为 false 的变量,如 null)时。 这样,所有名称相同的“模块”将被合并到同一个对象。

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

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

module mylib.gui {
}

代替

module mylib {
    module gui {
    }
}

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

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

module mylib {
    export module gui {
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

TypeScript 模块 的相关文章

随机推荐