Quelle est la différence entre les modules internes et externes dactylographiée?

voix
40

J'ai passé un peu de temps à lire la spécification du langage dactylographiée et je suis un peu confus au sujet de la différence entre internes et externes modules. Voici la description prise directement à partir du cahier des charges:

modules internes (section 9.2.2) sont des membres locaux ou exportés des autres modules (notamment le module global et des modules externes). Les modules internes sont déclarés à l'aide ModuleDeclarations qui spécifient leur nom et leur corps. Un chemin de nom avec plus d'un identifiant correspond à une série de déclarations de modules internes imbriquées.

modules externes (section 9.4) sont chargés séparément organismes de code référencés en utilisant les noms des modules externes. est écrit un module externe comme un fichier source séparé qui contient au moins une déclaration d'importation ou d'exportation. En outre, les modules externes peuvent être déclarés à l'aide AmbientModuleDeclarations dans le module global qui spécifient directement les noms de modules externes comme des chaînes. Ceci est décrit plus loin dans la section 0.

D'après ce que je comprends , je pense que les modules externes correspondent à des fichiers sans enfermer - typographique des définitions de module qui exportent simplement un ensemble de types et / ou variables. D'un autre fichier tapuscrit je peux simplement importer un module externe foo.ts avecimport foo = module(foo);

Quelqu'un peut-il me expliquer le destinction entre les modules externes et internes?

Créé 11/10/2012 à 15:10
source utilisateur
Dans d'autres langues...                            


3 réponses

voix
27

Les articles 9.3 et 9.4 de la spécification expliquent plus clairement. Je reproduis ici quelques-uns des exemples donnés dans ces sections.

modules externes

Supposons que le code suivant est main.ts.

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

Ce fichier fait référence à un module externe log, défini par quelles que soient les log.tsexportations.

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

Notez que log.tsne pas utiliser le modulemot - clé partout. Il exporte un peu les choses avec export.

modules internes

Ce fichier comporte deux modules internes, 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); 
  } 
}

Ces derniers se comportent ( la plupart du temps) comme des modules externes, mais ils sont contenus dans un seul fichier et vous ne devez pas faire référence à des fichiers en dehors de les utiliser. Ils doivent être contenu à l' intérieur d'un modulebloc lorsqu'ils sont définis.

Créé 11/10/2012 à 15:33
source utilisateur

voix
6

Selon Anders présentations: http://channel9.msdn.com/posts/Anders-Hejlsberg-Introducing-TypeScript (34:40) et de la documentation Tapuscrit, les modules externes sont des modules qui sont basés sur AMD (définition du modèle asynchrone) ou CommonJS.

Les modules externes sont utiles dans le sens qu'ils cachent les déclarations internes des définitions du module et ne montrent que les méthodes et les paramètres associés à la variable déclarée.

Supposons que vous ayez une Mainclasse avec une définie logméthode placée dans un transfer.jsfichier. Les méthodes internes de la Mainclasse ne sont visibles que lorsque vous importez le transfer.jsfichier en haut de la source js comme si: ///<reference path="transfer.js"/>. De cette façon , le compilateur élimine le traversal de tous les fichiers js lors de l' exécution.

Ceci est un énorme avantage d'utiliser des modules externes. Un autre est quand vous essayez de référencer une méthode externe ou une classe qui, dans le haut vers le bas flux normal javascript est défini plus tard que l'invocation de la méthode. En utilisant des modules externes de la classe référencée est instancié uniquement sur appel de méthode.

Créé 11/10/2012 à 15:49
source utilisateur

voix
1

Module interne:

  1. Vous pouvez définir des modules au sein de vos fichiers typescritp.
  2. Toutes les variables définies dans le module sont scope au module et retiré de la portée globale.
  3. Lorsque vous compilez vos fichiers tapuscrit vos modules sont convertis en variables qui nichent au besoin pour former des objets comme espace de noms. Notez que la classe définie dans le module est soigneusement isolé en utilisant une Ia vie (Expression fonctionnelle suite Appelé).
  4. Le code ci-dessous montre que la variable MyClass scope au module MyInternalModule. Ils ne sont pas accessibles à l'extérieur du module qui est la raison pour laquelle la dernière ligne du code indique l'erreur ne peut pas trouver le nom MyClass.
  5. Vous pouvez accéder à la variable en dehors du module en utilisant le mot-clé à l'exportation.
  6. Vous pouvez également étendre les modules internes, les partager entre les fichiers, et les référencer en utilisant la syntaxe barre oblique triple. (///)

exemple :

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

Compilé version dactylographiée:

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

Module externe:

exemple :

// 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);
    }
}
Créé 29/09/2016 à 07:35
source utilisateur

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