¿Cuál es la diferencia entre los módulos internos y externos a máquina de escribir?

votos
40

He pasado algún tiempo leyendo la especificación del lenguaje Letra de imprenta y estoy un poco confundido sobre la diferencia entre internos y externos módulos. Aquí está la descripción tomada directamente de la especificación:

módulos internos (sección 9.2.2) son miembros locales o exportados de otros módulos (incluyendo el módulo global y módulos externos). módulos internos se declaran mediante ModuleDeclarations que especifican su nombre y el cuerpo. Un camino nombre con más de un identificador es equivalente a una serie de declaraciones de módulos internos anidados.

Los módulos externos (sección 9.4) se cargan por separado cuerpos de código de referencia utilizando nombres de los módulos externos. Un módulo externo se escribe como un archivo fuente independiente que contiene al menos una declaración de importación o exportación. Además, los módulos externos pueden ser declaradas usando AmbientModuleDeclarations en el módulo global que especificar directamente los nombres de los módulos externos como literales de cadena. Esto se describe adicionalmente en la sección 0.

Por lo que he entendido creo que los módulos externos corresponden a los archivos de texto mecanografiado sin encerrar definiciones del módulo que simplemente exportan un conjunto de tipos y / o variables. De otro fichero de transcripción que pueda importación sencilla un módulo externo en foo.ts conimport foo = module(foo);

¿Puede alguien explicarme la destinction entre los módulos internos y externos?

Publicado el 11/10/2012 a las 15:10
fuente por usuario
En otros idiomas...                            


3 respuestas

votos
27

Secciones 9.3 y 9.4 de la especificación explicar esto con más claridad. Voy a reproducir aquí algunos de los ejemplos que se dan en esas secciones.

Los módulos externos

Supongamos el siguiente código se encuentra en main.ts.

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

Este archivo hace referencia a un módulo externo log, que se define por cualquier log.tsexportaciones.

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

Tenga en cuenta que log.tsno utiliza la modulepalabra clave en cualquier lugar. Simplemente exporta con cosas export.

módulos internos

Este archivo tiene dos módulos internos, 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); 
  } 
}

Estos se comportan (en su mayoría) como módulos externos, sino que están contenidas en un archivo y que no tiene que hacer referencia a los archivos externos para utilizarlos. Tienen que estar contenida dentro de un modulebloque cuando se definen.

Respondida el 11/10/2012 a las 15:33
fuente por usuario

votos
6

De acuerdo a las presentaciones de Anders: http://channel9.msdn.com/posts/Anders-Hejlsberg-Introducing-TypeScript (34:40) y la documentación de imprenta, los módulos externos son módulos que se basan en la parte superior de AMD (Asynchronous Modelo definición) o CommonJS.

Los módulos externos son útiles en el sentido que ocultan los estados internos de las definiciones del módulo y muestran sólo los métodos y parámetros asociados a la variable declarada.

Suponga que tiene una Mainclase con una definida logmétodo colocado en un transfer.jsarchivo. Los métodos internos de la Mainclase sólo son visibles cuando va a importar el transfer.jsarchivo en la parte superior del archivo js fuente como así: ///<reference path="transfer.js"/>. De esta manera el compilador elimina el recorrido de todos los archivos js en tiempo de ejecución.

Este es un gran beneficio del uso de módulos externos. Otra es cuando está intentando hacer referencia a un método externo o clase que en el de arriba hacia abajo JavaScript normales flujo se define más tarde de la invocación del método. El uso de módulos externos de la clase referenciada se instancia sólo en invocación de método.

Respondida el 11/10/2012 a las 15:49
fuente por usuario

votos
1

Módulo interno:

  1. Se pueden definir módulos dentro de sus archivos typescritp.
  2. Todas las variables definidas dentro del módulo están en el ámbito al módulo y se retiran del ámbito global.
  3. Cuando se compila sus archivos de texto mecanografiado sus módulos se convierten en variables que anidan si es necesario para formar objetos de espacio de nombres similares. Observe que la clase definida dentro del módulo se aísla cuidadosamente utilizando un IIFE (Inmediatamente Se invoca expresión de función).
  4. El código siguiente muestra que la variable MyClass como alcance el módulo MyInternalModule. No se puede acceder exterior del módulo es por eso que la última línea del código muestra el error no puede encontrar el nombre MiClase.
  5. Se puede acceder a la variable fuera del módulo usando la palabra clave de exportación.
  6. También puede extender módulos internos, compartirlos a través de archivos, y hacer referencia a ellos utilizando la sintaxis de triple barra. (///)

Ejemplo :

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

Compilado Versión de imprenta:

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 = {}));

Módulo externo:

Ejemplo :

// 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);
    }
}
Respondida el 29/09/2016 a las 04:35
fuente por usuario

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