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

голоса
40

Я потратил некоторое время на чтение спецификации языка Машинопись и я несколько смутился о разнице между внутренними и внешними модулями. Вот описание берется непосредственно из спецификации:

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

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

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

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

Задан 11/10/2012 в 15:10
источник пользователем
На других языках...                            


3 ответов

голоса
27

Разделы 9.3 и 9.4 спецификации объяснить это более четко. Я воспроизводить здесь некоторые из примеров, приведенных в этих разделах.

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

Предположим , что следующий код в 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блока , когда они определены.

Ответил 11/10/2012 в 15:33
источник пользователем

голоса
6

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

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

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

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

Ответил 11/10/2012 в 15:49
источник пользователем

голоса
1

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

  1. Модули можно определить в пределах вашего typescritp файлов.
  2. Все переменные, определенные в модуле находятся в области видимости к модулю и удаляются из глобального масштаба.
  3. При компиляции машинописи файлов ваших модули преобразуются в переменные, которые гнездятся в случае необходимости для формирования пространства имен, как объектов. Обратите внимание на то, что класс, определенный в модуле аккуратно изолированы с помощью IIFE (Сразу Вызывается функция Expression).
  4. Приведенный ниже код показывает, что переменная MyClass области видимости модуля MyInternalModule. Они не могут быть доступны за пределами модуля, поэтому последняя строка кода показывает ошибку не удается найти имя MyClass.
  5. Вы можете получить доступ к переменной вне модуля, используя ключевое слово экспорта.
  6. Вы можете также расширить внутренние модули, обмениваться ими через файлы, и ссылаться на них, используя тройной слэш. (///)

Пример :

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

Составитель версия Машинопись:

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);
    }
}
Ответил 29/09/2016 в 07:35
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more