Aký je rozdiel medzi internými a externými modulmi v TypeScripte?


Strávil som nejaký čas čítaním špecifikácie jazyka Typescript a som trochu zmätený z rozdielu medzi internými a externými modulmi. Tu je popis prevzatý priamo zo špecifikácie:

Interné moduly (odsek 9.2.2) sú lokálne alebo exportované členy iných modulov (vrátane globálneho modulu a externých modulov). Interné moduly sa deklarujú pomocou Deklarácií modulov, ktoré určujú ich meno a telo. Cesta mena s viacerými identifikátormi je ekvivalentná sérii vnorených deklarácií interného modulu.

Externé moduly (sekcia 9.4) sú samostatne načítané bloky kódu, na ktoré sa odkazuje pomocou názvov externých modulov. Externý modul je napísaný ako samostatný zdrojový súbor, ktorý obsahuje aspoň jedno importné alebo exportné vyhlásenie. Okrem toho môžu byť externé moduly deklarované pomocou AmbientModuleDeclarations v globálnom module, ktorý priamo špecifikuje názvy externých modulov ako reťazcové literály. Toto je podrobnejšie popísané v sekcii 0.

Z toho, čo som pochopil, si myslím, že externé moduly zodpovedajú typescript súborom bez obalujúcich definícií modulu, ktoré jednoducho exportujú sadu typov a/alebo premenných. Z iného typescript súboru môžem jednoducho importovať externý modul v foo.ts pomocou import foo=module("foo");

Môže mi niekto vysvetliť rozdiel medzi externými a internými modulmi?

Odpoveď č. 1

Časti 9.3 a 9.4 špecifikácie to vysvetľujú jasnejšie. Tu uvediem niektoré príklady uvedené v týchto častiach.

Externé moduly

Predpokladajme, že nasledujúci kód je v main.ts.

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

Tento súbor odkazuje na externý modul log, ktorý je definovaný tým, čo exportuje log.ts.

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

Všimnite si, že log.ts nikde nepoužíva kľúčové slovo module. Jednoducho exportuje veci pomocou export.

Interné moduly

Tento súbor má dva vnútorné moduly, 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); 
  } 
}

Tieto sa správajú (väčšinou) ako externé moduly, ale sú obsiahnuté v jednom súbore a na ich používanie nemusíte odkazovať na žiadne vonkajšie súbory. Musia byť obsiahnuté vo vnútri bloku module, keď sú definované.

Odpoveď č. 2

Podľa prezentácií Andersa: http://channel9.msdn.com/posts/Anders-Hejlsberg-Introducing-TypeScript (34:40) a dokumentácie TypeScript, externé moduly sú moduly, ktoré sú založené na AMD (Asynchronous Model Definition) alebo CommonJS.

Externé moduly sú užitočné v tom zmysle, že skrývajú vnútorné vyhlásenia definícií modulu a zobrazujú iba metódy a parametre spojené s deklarovanou premennou.

Predpokladajme, že máte triedu Main s definovanou metódou log, umiestnenú v súbore transfer.js. Interné metódy triedy Main sú viditeľné iba vtedy, keď importujete súbor transfer.js na začiatku zdrojového js súboru takto: ///<reference path="transfer.js"/>. Týmto spôsobom kompilátor eliminuje prehľadávanie všetkých js súborov počas behu.

Toto je obrovská výhoda používania externých modulov. Ďalšia je, keď sa snažíte odkazovať na externú metódu alebo triedu, ktorá je v bežnom top-down JavaScript toku definovaná neskôr než samotné volanie metódy. Používaním externých modulov sa referencovaná trieda vytvorí až pri volaní metódy.

Súvisiace články