Ответ 1
Это точно, как это работает! Если вы посмотрите на сгенерированный код javascript, он добавит в качестве анонимной функции, которая принимает объект, "объект модуля":
var mylib;
(function (mylib) {
var Button = (function () {
function Button(x) {
this.x = x;
}
return Button;
})();
mylib.Button = Button;
})(mylib || (mylib = {}));
Если вы посмотрите на последнюю строку (})(mylib || (mylib = {}));
), вы увидите, что она создает новый ojbect (mylib = {}
), только если существующая переменная имеет значение false (или что-то, что оценивается как false, как null).
Таким образом, все "модули", которые называются одинаковыми, будут объединены с одним и тем же объектом.
Поэтому внутренние модули расширяют друг друга. Я должен отметить, что я не совсем понял, что происходит с вложенными модулями.
Обновление: ваш код работает для меня, если я не использую синтаксис вложенного модуля, но измените его на синтаксис точки. например:.
module mylib.gui {
}
вместо
module mylib {
module gui {
}
}
Я попытаюсь выяснить, почему это происходит, поскольку я прочитал спецификацию, оба пути должны быть равными.
Обновление: если вложенный ссылочный модуль отмечен как экспортированный, он работает:
module mylib {
export module gui {
}
}