gpt4 book ai didi

module - typescript 模块

转载 作者:搜寻专家 更新时间:2023-10-30 20:33:02 25 4
gpt4 key购买 nike

我想知道是否有可能以某种方式将两个或多个文件中的两个或多个类添加到 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 类,所以将它们全部放在同一个文件中是不可能的。我所有的类(class)都在“mylib”模块中。但我该怎么做呢?

如果 module mylib {...} 被翻译成一个函数,那么所有文件中所有 mylib block 的所有内容都应该包含在同一个函数中。

这有可能吗?

当我编译时我得到这个:

$ 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 = {}));),您会发现它仅在现有变量为 false(或计算结果为 false 的变量,如 null)时才实例化一个新的 ojbect (mylib = {})。这样,所有同名的“模块”都将合并到同一个对象中。

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

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

module mylib.gui {
}

代替

module mylib {
module gui {
}
}

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

更新:如果嵌套引用的模块被标记为已导出,它会起作用:

module mylib {
export module gui {
}
}

关于module - typescript 模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12991382/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com