2015-09-15 2 views
0

Я создал простой файл машинописных файлов - 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 переменные, т.е. относились к нему как отдельное пространство имен.

Верно ли это? По handbook должно быть слиты ...

EDIT

примечание стороны файл по четкости (d.ts) - когда я бегу TSC с --declaration переключатель следующее определение генерируется. Животные модуля включали в себя дважды. Правильно ли это?

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

ответ

1

Но на игровой площадке вы можете увидеть, что она генерирует две переменные Животных, то есть обрабатывает ее как отдельное пространство имен.

Он генерирует две переменные (см. «Почему две функции сгенерированы, а не одна» link по причине). Тем не менее, это все равно единое пространство имен (уведомление Animals || (Animals = {} означает, что оно переносит предыдущее значение, если оно доступно).

Согласно руководству должно быть слито

Они объединены. Сгенерированный код гарантирует (используя Animals || (Animals = {}), что Animals выполняет от первое объявление модуля. В руководстве не сказано , как управляет этим слиянием (this does).

+0

Кажется, я неправильно понимаю, как работает слияние модулей. Но это все еще очень странно для меня. Что делать, если в одном модуле есть более 100 файлов, тогда переменная будет повторяться 100 раз? – Kai

+0

Кроме того, когда я пытаюсь сгенерировать определение из всех моих файлов, один d.ts-файл содержит несколько модулей с тем же именем и VSCode заявил, что это ошибка – Kai

+1

Хорошо, добавьте вопрос. Кроме того, @basarat благодарит вас за вашу работу над машинописными текстами – Kai

1

Хотя машинопись компилятор объединить типы двух модулей, эти типы больше не существует в скомпилированном JavaScript (с точки зрения безопасности типа). В javasript важна только реализация модуля, поэтому слияние реализаций происходит во время выполнения.

Две декларации var Animals не конфликтуют, и каждая из функций, добавляющих элементы в модуль Animals, вызывается с (Animals || (Animals = {}). Которая либо будет использовать текущее значение переменной Animals, либо установить Animals на новый пустой объект, а затем использовать это.

Важное значение имеет то, что это происходит во время выполнения, поскольку оно позволяет расширять объекты, созданные за пределами файла, над которым вы работаете. Например, вы можете расширить встроенные объекты, используя тот же синтаксис. Проверьте this playground example, чтобы увидеть, как он объединяется с встроенными объектами.

Смежные вопросы