В чем разница между внутренними и внешними модулями в TypeScript?
=================================================================

Я потратил некоторое время на чтение спецификации языка Typescript, и меня немного смущает разница между**внутренний** а также**внешний** модули. Вот описание, взятое непосредственно из спецификации:

Внутренние модули (раздел 9.2.2) являются локальными или экспортируемыми членами других модулей (включая глобальный модуль и внешние модули). Внутренние модули объявляются с использованием ModuleDeclarations, в котором указывается их имя и тело. Путь имени с более чем одним идентификатором эквивалентен серии вложенных объявлений внутренних модулей.

Внешние модули (раздел 9.4) представляют собой отдельно загруженные части кода, на которые ссылаются с использованием имен внешних модулей. Внешний модуль записывается в виде отдельного исходного файла, который содержит хотя бы одно объявление импорта или экспорта. Кроме того, внешние модули могут быть объявлены с помощью AmbientModuleDeclarations в глобальном модуле, который напрямую указывает имена внешних модулей в виде строковых литералов. Это описано далее в разделе 0.

Из того, что яЯ понял, что я думаю, что внешние модули соответствуют файлам машинописи без вложенных в них определений модулей, которые просто экспортируют набор типов и / или переменных. Из другого машинописного файла я могу просто импортировать внешний модуль в**foo.ts** с`import foo = module("foo");`

Может кто-нибудь объяснить мне различие между внешним и внутренним модулями?

Воспроизведу здесь некоторые примеры, приведенные в этих разделах.

Внешние модулиПредположим, следующий код находится в.`main.ts`

Этот файл ссылается на внешний модуль`log`, определяемый любым`log.ts` экспорт.

Заметить, что`log.ts` Безразлично»т использовать`module` ключевое слово где угодно. Он просто экспортирует вещи с.`export`

Внутренние модулиЭтот файл имеет два внутренних модуля.`X.Y.Z`

Они ведут себя (в основном) как внешние модули, но они содержатся в одном файле, и вы неЧтобы использовать их, нужно ссылаться на любые внешние файлы. Они должны содержаться внутри`module` блок, когда они определены.



<http://channel9.msdn.com/posts/Anders-Hejlsberg-Introducing-TypeScript> (34:40) и документации Typescript, внешние модули - это модули, основанные на топовых AMD (определение асинхронной модели) или CommonJS.

Внешние модули полезны в том смысле, что они скрывают внутренние операторы определений модулей и показывают только методы и параметры, связанные с объявленной переменной.

Предположим, у вас есть`Main` класс с определенным`log` метод помещен в`transfer.js` файл. Внутренние методы`Main` класс видны только при импорте`transfer.js` файл в верхней части исходного файла JS как так:`///`, Таким образом, компилятор исключает обход всех js-файлов во время выполнения.



**Внутренний модуль:**

 определенные в модуле, попадают в модуль и удаляются из глобальной области видимости.Когда вы компилируете свои машинописные файлы, ваши модули преобразуются в переменные, которые вкладываются по мере необходимости для формирования объектов, подобных пространству имен. Обратите внимание, что класс, определенный в модуле, аккуратно изолирован с помощью IIFE (выражение для немедленного вызова функции).Приведенный ниже код показывает, что переменная MyClass находится в области действия модуля MyInternalModule. Они не могут быть доступны вне модуля, которыйИз-за того, что в последней строке кода отображается ошибка, невозможно найти имя MyClass.Вы можете получить доступ к переменной вне модуля, используя ключевое слово export.Вы также можете расширять внутренние модули, делиться ими между файлами и ссылаться на них, используя синтаксис тройной косой черты. (///)**Пример:**

Скомпилированная версия Typescript:

**Внешний модуль:**

**Пример:**