Jaka jest różnica pomiędzy modułami wewnętrznymi i zewnętrznymi na maszynie?

głosy
40

Spędziłem trochę czasu na czytanie specyfikacji języka Typescript i jestem nieco mylić o różnicę między wewnętrznymi i zewnętrznymi modułami. Oto opis pobierany bezpośrednio od specyfikacji:

moduły wewnętrzne (sekcja 9.2.2) są lokalne lub wywożone członkowie innych modułów (w tym module globalnej i modułów zewnętrznych). moduły wewnętrzne są zadeklarowane używając ModuleDeclarations które określają ich nazwy i ciało. Ścieżka nazwa z więcej niż jednego identyfikatora odpowiada serii zagnieżdżonych zgłoszeń moduł wewnętrznego.

moduły zewnętrzne (sekcja 9.4) są oddzielnie ładowane ciał Kod opisany za pomocą zewnętrznych nazw modułu. Moduł zewnętrzny jest zapisywany jako osobny plik źródłowy, który zawiera co najmniej jedną deklarację importu lub eksportu. Ponadto moduły zewnętrzne mogą zostać uznane za pomocą AmbientModuleDeclarations w globalnej modułu, który bezpośrednio określenia zewnętrznych nazw modułu jako napisowych. Jest to opisane w punkcie 0.

Z tego, co mam rozumieć myślę, że moduły zewnętrzne odpowiadają maszynopis plików bez załączając definicji modułu, który po prostu wyeksportować zestaw typów i / lub zmiennych. Z innego pliku maszynopis mogę prosty import moduł zewnętrzny w foo.ts zimport foo = module(foo);

Czy ktoś może wyjaśnić mi destinction pomiędzy modułami zewnętrznymi i wewnętrznymi?

Utwórz 11/10/2012 o 15:10
źródło użytkownik
W innych językach...                            


3 odpowiedzi

głosy
27

Sekcje 9.3 i 9.4 specyfikacji wytłumaczyć to jaśniej. będę tutaj powielać niektóre z przykładów podanych w tych sekcjach.

moduły zewnętrzne

Załóżmy, że następujący kod znajduje main.ts.

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

Plik ten odwołuje się do modułu zewnętrznego log, zdefiniowany za pomocą dowolnych log.tseksportu.

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

Zauważ, że log.tsnie używa modulesłowa kluczowego w dowolnym miejscu. To właśnie eksportuje rzeczy export.

moduły wewnętrzne

Ten plik posiada dwa moduły wewnętrznych 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); 
  } 
}

Te zachowują (w większości) jak modułów zewnętrznych, ale są one zawarte w jednym pliku i nie trzeba odwoływać się do żadnych zewnętrznych plików z nich korzystać. Muszą być zawarty wewnątrz modulebloku, gdy są one określone.

Odpowiedział 11/10/2012 o 15:33
źródło użytkownik

głosy
6

Według prezentacji Anders: http://channel9.msdn.com/posts/Anders-Hejlsberg-Introducing-TypeScript (34:40) i Typescript dokumentacja, moduły zewnętrzne są moduły, które oparte są na górze AMD (asynchroniczny model Definition) lub CommonJS.

Moduły zewnętrzne są użyteczne w sensie ukrycia wewnętrznych sprawozdań z definicji modułu i pokazać tylko te metody i parametry związane zmiennej zadeklarowanej.

Załóżmy, że masz Mainklasę o określonej logmetody umieszczone w transfer.jspliku. Wewnętrzne metody w Mainklasie są widoczne tylko podczas importowania transfer.jspliku na początku pliku źródłowego jako js tak: ///<reference path="transfer.js"/>. W ten sposób kompilator eliminuje przechodzenie wszystkich plików js przy starcie.

Jest to ogromna korzyść z wykorzystaniem modułów zewnętrznych. Kolejnym jest, kiedy próbuje odwoływać się do metody zewnętrznego lub klasy, które w normalnym odgórnym javascript przepływu jest zdefiniowany później niż metoda pw. Korzystanie z modułów zewnętrznych odwołuje klasy jest tworzony tylko na wywołania metody.

Odpowiedział 11/10/2012 o 15:49
źródło użytkownik

głosy
1

Moduł wewnętrzny:

  1. Można zdefiniować moduły wewnątrz plików typescritp.
  2. Wszystkie zmienne zdefiniowane w module są zawężona do modułu i usunąć z zasięgu globalnym.
  3. Kiedy skompilować maszynopis plikami moduły są przekształcane w zmiennych gniazdo jako koniecznych do utworzenia przestrzeni nazw obiektów podobnego. Należy zauważyć, że klasa zdefiniowane w module jest starannie wyizolowano stosując Iife (bezpośrednio Wykonano Expression Function).
  4. Poniższy kod pokazuje, że zmienna MojaKlasa zawężona do modułu MyInternalModule. Nie mogą one być dostępne na zewnątrz modułu, dlatego ostateczna linia kodu pokazuje błąd nie można odnaleźć nazwy MojaKlasa.
  5. Możesz uzyskać dostęp do zmiennej zewnątrz modułu przy użyciu słowa kluczowego eksportowej.
  6. Możesz również rozszerzyć moduły wewnętrzne, udostępniać je w plikach i odwoływać się do nich za pomocą potrójnego składni slash. (///)

Przykład :

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

Skompilowana wersja maszynopisu:

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

Moduł zewnętrzny:

Przykład :

// 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);
    }
}
Odpowiedział 29/09/2016 o 07:35
źródło użytkownik

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