Care este diferența dintre modulele interne și externe dactilografiat?

voturi
40

Am petrecut ceva timp citind caietul de sarcini limba typescript și sunt oarecum confuz despre diferența dintre interne și externe module. Aici este descrierea luată direct din caietul de sarcini:

Module interne (secțiunea 9.2.2) sunt membri locali sau exportate de alte module (inclusiv modulul global și modulele externe). Modulele interne sunt declarate folosind ModuleDeclarations care precizează numele și corpul lor. O cale de nume, cu mai mult de un identificator este echivalent cu o serie de declarații nested modulului interne.

Module externe (secțiunea 9.4) sunt corpurile de cod care se face referire, folosind module externe încărcate separat. Un modul extern este scris ca un fișier sursă separat, care conține cel puțin o declarație de import sau de export. În plus, modulele externe pot fi declarate folosind AmbientModuleDeclarations în modulul la nivel mondial care specifică în mod direct numele de module externe, ca un sir de caractere. Acest lucru este descris în secțiunea 0.

Din ce am înțeles eu cred că modulele externe corespund typescript fișiere fără incorporare definiții ale modulului care pur și simplu exporta un set de tipuri și / sau variabile. Dintr - un alt fișier dactilografiat I poate importa simplu un modul extern în foo.ts cuimport foo = module(foo);

Poate cineva să-mi explice destinction între modulele interne și externe?

Întrebat 11/10/2012 la 15:10
sursa de către utilizator
În alte limbi...                            


3 răspunsuri

voturi
27

Secțiunile 9.3 și 9.4 din caietul de sarcini explica acest lucru mai clar. Voi reproduce aici câteva dintre exemplele date în aceste secțiuni.

module externe

Să presupunem că următorul cod este main.ts.

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

Acest fișier face trimitere la un modul extern log, definit prin orice log.tsexporturi.

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

Observați că log.tsnu utilizează modulecuvântul cheie oriunde. Se exportă doar lucruri cu export.

module interne

Acest fișier are două module interne, 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); 
  } 
}

Acestea se comporta (mai ales) , cum ar fi module externe, dar acestea sunt conținute într - un singur fișier și nu trebuie să facă referire orice fișiere din afara pentru a le folosi. Ei trebuie să fie conținută în interiorul unui modulebloc atunci când acestea sunt definite.

Publicat 11/10/2012 la 15:33
sursa de către utilizator

voturi
6

Potrivit prezentari Anders: http://channel9.msdn.com/posts/Anders-Hejlsberg-Introducing-TypeScript (34:40) și documentația typescript, modulele externe sunt module care se bazează pe partea de sus AMD (asincronă model Definition) sau CommonJS.

Modulele externe sunt utile în sensul ei ascund declarațiile interne ale definițiilor modulului și arată doar metodele și parametrii asociate variabilei declarate.

Să presupunem că aveți o Mainclasă cu o definită logmetoda plasată într - un transfer.jsfișier. Metodele interne ale Mainclasei sunt vizibile numai atunci când importați transfer.jsfișierul în partea de sus a fișierului js ca sursă , astfel: ///<reference path="transfer.js"/>. În acest fel compilatorul elimină toate fișierele de traversal JS în timpul rulării.

Acesta este un avantaj foarte mare de utilizare a modulelor externe. Un alt unul este atunci când încercați să referință o metodă externă sau o clasă care, în normale de sus-jos javascript flux este definit mai târziu decât invocarea metodei. Utilizarea modulelor externe clasa de referință este instanțiat doar pe metoda de invocare.

Publicat 11/10/2012 la 15:49
sursa de către utilizator

voturi
1

Modulul intern:

  1. Puteți defini modulele în fișierele typescritp.
  2. Toate variabilele definite în cadrul modulului sunt scoped la modulul și eliminate din domeniul de aplicare la nivel mondial.
  3. Când compila fișierele dactilografiat dvs. modulele sunt convertite în variabile care cuib după cum este necesar pentru a forma obiecte-spațiu de nume cum ar fi. Observați că clasa definită în cadrul modulului este frumos izolat folosind o viata (Invocat Imediat Expression Function).
  4. Codul de mai jos arată că variabila Clasa_Mea scoped la modulul MyInternalModule. Ele nu pot fi accesate în afara modulului de aceea linia finală a codului arată eroarea nu poate găsi numele Clasa_Mea.
  5. Puteți accesa variabila afara modulului folosind cuvântul cheie de export.
  6. Puteți extinde, de asemenea, module interne, să le partajați peste fișiere și să le referință folosind sintaxa triplă slash. (///)

exemplu :

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

Compilat Versiune dactilografiate:

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

Modul extern:

exemplu :

// 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);
    }
}
Publicat 29/09/2016 la 07:35
sursa de către utilizator

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