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

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

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

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

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

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

Ответы на вопрос(3)

Решение Вопроса

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

Внешние модули

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

import log = module("log");
log.message("hello");

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

export function message(s: string) { 
  console.log(s); 
}

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

Внутренние модули

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

module A.B.C { 
  import XYZ = X.Y.Z; 
  export function ping(x: number) { 
    if (x > 0) XYZ.pong(x – 1); 
  }
} 
module X.Y.Z { 
  import ABC = A.B.C; 
  export function pong(x: number) { 
    if (x > 0) ABC.ping(x – 1); 
  } 
}

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

 Sam19 сент. 2013 г., 09:14
Кажется ли, что внешний модуль является неявным модулем, в то время как внутренний модуль является явным модулем?
 Peter Olson19 сент. 2013 г., 15:11
Если под явным вы подразумеваететребуетmodule ключевое слово", да.
 Sam20 сент. 2013 г., 03:07
Да под неявным я имею ввидуЭто's модуль, потому что содержимое находится в файле " и явный модуль является явным, потому что этоявно определены с помощью ключевого слова. Теперь все это не делаетt помогает понять различия, когда речь заходит об окружающих модулях.

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

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

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

Это огромное преимущество использования внешних модулей. Другой случай, когда вы пытаетесь сослаться на внешний метод или класс, который в обычном нисходящем потоке JavaScript определяется позже, чем вызов метода. При использовании внешних модулей указанный класс создается только при вызове метода.

 Ian Warburton27 мар. 2014 г., 11:37
Я задал вопрос об этом видео ...stackoverflow.com/questions/22684802/...

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

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

Пример:

module MyInternalModule{  
    class MyClass{               //if We write export keyword before the MyClass then last line works fine
        constructor (
            public height: number, 
            public width: number) {
    }
    }                   
    //working properly
    var obj1 = new MyClass(10, 4);
}

// it wont work //Because the out of the scope
var obj2 = new MyInternalModule.MyClass(10,4) //shows error: can not find name MyClass

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

var MyInternalModule;
(function (MyInternalModule) {
    var MyClass = (function () {
        function MyClass(height, width) {
            this.height = height;
            this.width = width;
        }
        return MyClass;
    })();
    //working properly
    var obj1 = new MyClass(10, 4);
})(MyInternalModule || (MyInternalModule = {}));

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

Пример:

// bootstrapper.ts file

// imports the greeter.ts file as the greeter module
import gt = module('greeter');  
export function run() {  
    var el = document.getElementById('content');
    var greeter = new gt.Greeter(el);
    greeter.start(); 
}

// greeter.ts file

// exports the entire module
export class Greeter {  
    start() {
         this.timerToken = setInterval(() => 
             this.span.innerText = 
             new Date().toUTCString(), 500);
    }
}

Ваш ответ на вопрос