TypeScript中已声明的模块将被重新声明
Declared module in TypeScript gets redeclared
我现在正在经历一些非常奇怪的事情。
我只是想把一个模块分成不同的文件——正如这个链接中所描述的https://typescript.codeplex.com/wikipage?title=Modules%20in%20TypeScript.所以这似乎是可能的。
由于这不起作用,我在一个文件中尝试了它(见下面的代码),但也不起作用。
declare module Admin {
export class Blubber {
}
}
module Admin {
export class InlineMail {
}
}
编译的结果是:
var Admin;
(function (Admin) {
var InlineMail = (function () {
function InlineMail() {
}
return InlineMail;
})();
Admin.InlineMail = InlineMail;
})(Admin || (Admin = {}));
事实上,"Blubber"是不坏的,因为这是在其他地方定义的。但是:
var admin
非常烦人。我声明了模块,但它仍然被定义?这没有道理。如果我多次这样做,它会编译成多个var Admin
。。。
有人能帮上这个吗?如何合并模块?
我认为你实际上应该没事。TypeScript的输出有点冗长,但为了安全起见,它使用的任何其他JS都是安全的。首先,不要担心var
的使用。
x = 2;
var x;
console.log(x); // 2!
var语句实际上不会删除现有的Admin对象。更重要的是,你得到了这条线的帮助:
})(Admin || (Admin = {}));
定义InlineMail模块的方法实际上是查看并使用现有的Admin对象,并将其添加到其中,而不是创建一个新对象。
如果您决定对主Admin.js采用类似的构造,那么首先调用哪个可能并不重要。
在实际的代码生成中,整个declare
块在很大程度上被忽略——它所做的只是告诉编译器"这就是Admin模块的样子",如果与预期不符,就会抛出错误。这有点像类(蓝图)和对象(房子)之间的区别
编译器必须这样做,因为实际上,它不知道脚本的加载顺序。Blubber
和InlineMail
之间可能存在某种循环依赖关系,而实际上模块的另一半将比该文件晚加载。
想象一下相反的世界,TypeScript看到任何module
或declare module
的第一个实例,并说"明白了,现在由你来确保var
在运行时存在"。您将无法做其他明智的事情,比如只在某些网页上有条件地加载模块的某些部分。您还必须确保加载,否则顺序不可知的代码将与编译器看到的顺序完全相同,这太疯狂了。这将是一个巨大的痛苦,每个人都会理所当然地抱怨
额外的var
语句在实践中是完全无害的。如果需要,可以通过强迷你程序运行.js代码。
- Dojo不解析自定义小部件的模板html中的小部件声明性
- 在原型上声明新方法
- 在ES6中,什么是新规范,“块级函数声明”的意思
- 在 javascript 中 for 循环的每次迭代中声明一个新的、唯一的变量是一种好方法
- 在 JavaScript 中,在声明对象的新键:值对时,引用对象的变量名与使用“this”之间是否存在差异
- 新的dijit.form.Button在声明时保持自动点击
- 声明新变量或在函数中使用引用
- 正则表达式在字面声明时有效,但在使用新运算符和变量值声明时无效
- 在方法中动态声明新的“类字段” - 是否是好的做法
- 声明与RESTful一起使用的模型定义”;新的“;在Angular中
- 如何将函数声明和新运算符组合为一条语句
- 在使用PHP和jQuery上传图像时声明新的formData()
- 如何在声明的对象中添加具有相同键名的新属性
- 在javascript中何时声明一个新的(匿名)函数
- 链接(重定向)以隐身方式打开,或在新选项卡中打开,或显式声明了新页面.刚点击时不工作
- 声明一个新函数与立即调用它
- 如何获取声明新对象的变量的名称
- 如何使用条件重新分配和声明新变量
- PostCSS:如何基于当前规则中的声明有条件地添加新规则
- 在JavaScript中声明一个新的子类作为原型方法是可以的吗?