我创建了简单的打字稿文件 - 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 {
}
}
答案 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)