Was ist der Unterschied zwischen internen und externen Module in Typoskript?

stimmen
40

Ich habe einige Zeit mit dem Lesen der Typoskript Sprachspezifikation verbracht und bin etwas verwirrt über den Unterschied zwischen internen und externen Modulen. Hier ist die Beschreibung direkt aus der Spezifikation genommen:

Interner Module (Abschnitt 9.2.2) sind lokale oder exportierten Mitglieder anderer Module (einschließlich der globalen Modul und externe Module). Interne Module werden mit ModuleDeclarations erklärt, die ihren Namen und Körper angeben. Ein Name Pfad mit mehr als einer Kennung ist an eine Reihe von verschachtelten internen Moduldeklarationen äquivalent.

Externe Module (Abschnitt 9.4) werden separat Körper des Code geladen externe Modulnamen referenziert werden. Ein externes Modul wird als separate Quelldatei geschrieben, die mindestens einen Import oder Export Deklaration enthält. Darüber hinaus können externe Module erklärt AmbientModuleDeclarations im globalen Modul verwenden, der direkt die externen Modulnamen als Zeichenketten angeben. Dies wird weiter beschrieben in Abschnitt 0.

Von dem, was ich verstanden habe denke ich , dass externe Module Dateien Typoskript entspricht ohne Moduldefinitionen einschließt , die einfach eine Reihe von Typen und / oder Variablen exportieren. Aus einer anderen Typoskript - Datei kann ich einfach importiert ein externes Modul in foo.ts mitimport foo = module(foo);

Kann jemand mir die destinction zwischen externen und internen Module erklären?

Veröffentlicht am 11/10/2012 um 15:10
quelle vom benutzer
In anderen Sprachen...                            


3 antworten

stimmen
27

Abschnitte 9.3 und 9.4 der Spezifikation erklären dies deutlicher. Ich werde hier einige der in diesen Abschnitten angegebenen Beispiele reproduzieren.

externe Module

Angenommen , der folgende Code ist in main.ts.

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

Diese Datei verweist auf ein externes Modul log, definiert mit welchen log.tsExporte.

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

Beachten Sie, dass log.tsdas nicht der Fall ist verwenden moduleSchlüsselwort überall. Es exportiert nur Dinge mit export.

interner Module

Diese Datei verfügt über zwei interne Module 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); 
  } 
}

Diese verhalten sich (meist) wie externe Module, aber sie sind in einer Datei enthalten , und Sie haben noch keine außerhalb Dateien zu verweisen , sie zu benutzen. Sie müssen innerhalb eines enthalten sein moduleBlock , wenn sie definiert sind.

Beantwortet am 11/10/2012 um 15:33
quelle vom benutzer

stimmen
6

Laut Anders Präsentationen: http://channel9.msdn.com/posts/Anders-Hejlsberg-Introducing-TypeScript (34:40) und Typoskript Dokumentation, die externen Module sind Module , die auf AMD (Asynchronous Model Definition) beruhen oder Commonjs.

Externe Module sind nützlich in Sinn sie die internen Anweisungen der Moduldefinitionen und zeigen nur die Methoden und Parameter, die auf die deklarierte Variable verbergen.

Angenommen , Sie haben MainKlasse mit einem definierten logVerfahren in einer platzierten transfer.jsDatei. Die internen Methoden der MainKlasse sind nur sichtbar , wenn Sie die zu importierenden transfer.jsDatei an der Spitze der Quelle js Datei als so: ///<reference path="transfer.js"/>. Auf diese Weise der Compiler beseitigt die Traversal aller js Dateien zur Laufzeit.

Dies ist ein großer Vorteil von externen Modulen. Ein weiteres ist, wenn Sie versuchen, eine externe Methode oder Klasse zu verweisen, die in der normalen Top-down-JavaScript-Flow definiert wird später als der Methodenaufruf. Verwendung externer Module wird die referenzierte Klasse nur auf Methodenaufruf instanziiert.

Beantwortet am 11/10/2012 um 15:49
quelle vom benutzer

stimmen
1

Interne Modul:

  1. Sie können Module in Ihrer typescritp Dateien definieren.
  2. Alle Variablen innerhalb des Moduls definiert sind mit dem Modul scoped und aus dem globalen Bereich entfernt.
  3. Wenn Sie kompilieren Ihre Typoskript Dateien Ihre Module werden in Variablen umgewandelt, dass Nest als notwendig Namespace-ähnliche Objekte zu bilden. Beachten Sie, dass die Klasse innerhalb des Moduls definiert ist ordentlich ein IIFE isoliert unter Verwendung von (sofort aufgerufen Funktion Expression).
  4. Der folgende Code zeigt, dass die MyClass Variable auf den MyInternalModule Modul scoped. Sie können nicht außerhalb des Moduls zugegriffen werden, deshalb die letzte Zeile des Codes zeigt der Fehler nicht Namen MyClass finden.
  5. Sie können die Variable außerhalb des Moduls Zugriff auf den Export Schlüsselwort.
  6. Sie können auch interne Module erweitern, so dass sie über Dateien gemeinsam nutzen, und verweisen sie die dreifache Strich-Syntax. (///)

Beispiel :

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

Version von Typoskript zusammengestellt:

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

Externe Module:

Beispiel :

// 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);
    }
}
Beantwortet am 29/09/2016 um 07:35
quelle vom benutzer

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