TypeScript中已声明的模块将被重新声明

Declared module in TypeScript gets redeclared

本文关键字:声明 新声明 模块 TypeScript      更新时间:2023-09-26

我现在正在经历一些非常奇怪的事情。

我只是想把一个模块分成不同的文件——正如这个链接中所描述的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模块的样子",如果与预期不符,就会抛出错误。这有点像类(蓝图)和对象(房子)之间的区别

编译器必须这样做,因为实际上,它不知道脚本的加载顺序。BlubberInlineMail之间可能存在某种循环依赖关系,而实际上模块的另一半将比该文件晚加载。

想象一下相反的世界,TypeScript看到任何moduledeclare module的第一个实例,并说"明白了,现在由你来确保var在运行时存在"。您将无法做其他明智的事情,比如只在某些网页上有条件地加载模块的某些部分。您还必须确保加载,否则顺序不可知的代码将与编译器看到的顺序完全相同,这太疯狂了。这将是一个巨大的痛苦,每个人都会理所当然地抱怨

额外的var语句在实践中是完全无害的。如果需要,可以通过强迷你程序运行.js代码。