Qual è la differenza tra i moduli interni ed esterni a macchina?

voti
40

Ho trascorso qualche tempo a leggere le specifiche del linguaggio tipografico e sono un po 'confuso circa la differenza tra interni ed esterni moduli. Ecco la descrizione presi direttamente dalle specifiche:

moduli interni (sezione 9.2.2) sono membri locali o esportati di altri moduli (compreso il modulo globale e moduli esterni). moduli interni vengono dichiarate utilizzando ModuleDeclarations che specificano il loro nome e il corpo. Un percorso nome con più di un identificatore è equivalente ad una serie di dichiarazioni moduli interni nidificate.

moduli esterni (sezione 9.4) sono corpi di codice riferimento utilizzando nomi dei moduli esterni caricati separatamente. Un modulo esterno è scritto come un file di origine separato che contiene almeno un dichiarazione di importazione o di esportazione. Inoltre, i moduli esterni possono essere dichiarate utilizzando AmbientModuleDeclarations nel modulo globale che specificano direttamente i nomi dei moduli esterni come stringhe letterali. Questo è descritto ulteriormente nella sezione 0.

Da quello che ho capito io penso che i moduli esterni corrispondono a-tipografica file senza che racchiude le definizioni di moduli che esportano semplicemente un insieme di tipi e / o variabili. Da un altro file typescript posso semplice importare un modulo esterno in foo.ts conimport foo = module(foo);

Qualcuno può spiegare a me il destinction tra i moduli interni ed esterni?

È pubblicato 11/10/2012 alle 15:10
fonte dall'utente
In altre lingue...                            


3 risposte

voti
27

Le sezioni 9.3 e 9.4 della specifica spiegano questo in modo più chiaro. Io riporto qui alcuni degli esempi forniti in quelle sezioni.

moduli esterni

Supponiamo che il seguente codice è in main.ts.

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

Questo file fa riferimento a un modulo esterno log, definito da qualunque log.tsesportazioni.

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

Si noti che log.tsnon utilizza la moduleparola chiave da nessuna parte. E 'appena esporta le cose con export.

moduli interni

Questo file è dotato di due moduli interni, 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); 
  } 
}

Questi si comportano (soprattutto) come moduli esterni, ma sono contenute in un file e non si dispone di fare riferimento a tutti i file al di fuori di usarli. Devono essere contenuto all'interno di un moduleblocco quando essi sono definiti.

Risposto il 11/10/2012 a 15:33
fonte dall'utente

voti
6

Secondo presentazioni Anders: http://channel9.msdn.com/posts/Anders-Hejlsberg-Introducing-TypeScript (34:40) e la documentazione tipografico, i moduli esterni sono moduli che si basano sulla parte superiore AMD (Asynchronous modello Definition) o CommonJS.

moduli esterni sono utili in senso nascondono i rendiconti interni delle definizioni di modulo e mostrano solo i metodi ei parametri associati alla variabile dichiarata.

Supponiamo di avere una Mainclasse con un definito logmetodo collocato in un transfer.jsfile. I metodi interni della Mainclasse sono visibili solo quando si importa il transfer.jsfile nella parte superiore del file js fonte come così: ///<reference path="transfer.js"/>. In questo modo il compilatore elimina l'attraversamento di tutti i file js in fase di esecuzione.

Questo è un enorme vantaggio di utilizzare moduli esterni. Un altro è quando si sta tentando di riferimento a un metodo esterno o una classe che nel normale top-down JavaScript flusso definita entro il metodo. Utilizzando moduli esterni la classe di riferimento è istanziata solo sul metodo.

Risposto il 11/10/2012 a 15:49
fonte dall'utente

voti
1

Modulo interno:

  1. È possibile definire i moduli all'interno dei file typescritp.
  2. Tutte le variabili definite all'interno del modulo vengono ambiti al modulo e rimossi dalla portata globale.
  3. Quando si compila i vostri file dattiloscritto i moduli vengono convertite in variabili che nidificano come necessario formare gli oggetti dello spazio dei nomi simili. Si noti che la classe definita all'interno del modulo è ben isolata utilizzando un IIFE (immediatamente Invocato espressione di funzione).
  4. Il codice seguente mostra che la variabile MyClass ambito al modulo MyInternalModule. Essi non sono accessibili al di fuori del modulo è per questo che la riga finale del codice mostra l'errore non può trovare il nome MyClass.
  5. È possibile accedere alla variabile all'esterno del modulo utilizzando la parola chiave di esportazione.
  6. È inoltre possibile estendere moduli interni, condividerli attraverso i file, e fare riferimento utilizzando la sintassi tripla barra. (///)

esempio :

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

Compilato Versione di Carattere tipografico:

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

Modulo esterno:

esempio :

// 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);
    }
}
Risposto il 29/09/2016 a 07:35
fonte dall'utente

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