模块合并 - 它是如何工作的?

时间:2015-09-15 21:28:53

标签: javascript typescript

我创建了简单的打字稿文件 - playground link

module Animals {
    export class Zebra { }
}
module Animals {
    export interface Legged { numberOfLegs: number; }
    export class Dog { }
}

从我的观点来看,它相当于:

module Animals {
    export class Zebra { }
    export interface Legged { numberOfLegs: number; }
    export class Dog { }
}  

并且应该生成:

var Animals;
(function (Animals) {
    var Zebra = (function () {
        function Zebra() {
        }
        return Zebra;
    })();
    Animals.Zebra = Zebra;
    var Dog = (function () {
        function Dog() {
        }
        return Dog;
    })();
    Animals.Dog = Dog;
})(Animals || (Animals = {}));  

但是在操场上你可以看到它生成了两个Animals变量,即将其视为单独的命名空间。

这是对的吗?根据{{​​3}},它应该合并......

编辑

根据定义文件的旁注(d.ts) - 当我使用--declaration运行tsc时,生成以下定义。模块动物包括两次。这是对的吗?

declare module Animals {
    class Zebra {
    }
}
declare module Animals {
    interface Legged {
        numberOfLegs: number;
    }
    class Dog {
    }
}

2 个答案:

答案 0 :(得分:1)

尽管typescript编译器将合并两个模块的类型,但在编译的javascript中不再存在这些类型(从类型安全的角度来看)。在javasript中,只有模块的实现很重要,因此实现的合并在运行时发生。

两个<!DOCTYPE HTML> <html> <head> <script> var dialog = document.getElementById('window'); document.getElementById('show').onclick = function() { dialog.show(); }; document.getElementById('exit').onclick = function() { dialog.close(); }; </script> <style> dialog { width: 500px; background:black; border: 1px solid #dadada; font-family:sans-serif; padding: 5px 10px 20px 20px; } </style> </head> <body> <dialog id="window"> <h3>Sample Dialog!</h3> <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Earum, inventore!</p> <button id="exit">Close Dialog</button> </dialog> <button id="show">Show Dialog</button> </body> </html> 声明不冲突,并且使用var Animals调用向Animals模块添加成员的每个函数。哪个将使用(Animals || (Animals = {})变量的当前值,或将Animals设置为新的空对象,然后使用它。

在运行时发生这种情况很重要,因为它允许您扩展在您正在处理的文件之外创建的对象。例如,您可以使用相同的语法扩展内置对象。查看this playground example以了解它如何与内置对象合并。

答案 1 :(得分:1)

  

但是在操场上你可以看到它生成两个动物变量,即将其视为单独的命名空间。

它确实生成了两个变量(参见“为什么生成两个函数而不是一个”link的原因)。但是它仍然是单个命名空间(注意Animals || (Animals = {}表示如果可用的话,它会带有先前的值)。

  

根据手册,它应该合并

他们被合并了。生成的代码确保(使用Animals || (Animals = {}Animals第一个模块声明继承。该手册未说 如何管理此合并(this does)。