Tapuscrit: Plusieurs projets en solution

voix
10

J'ai fini le portage d'une bibliothèque JavaScript pour tapuscrit dans Visual Studio 2012. Dans l'ensemble de ses 60 classes, avec chaque classe définie dans son propre fichier .ts.

Toutes les classes sont définies dans le même module. J'utilise des commentaires de référence pour Reder aux classes définies dans d'autres fichiers. La mise en page de chaque fichier ressemble à ceci:

///<reference path='./../myotherclass.ts' />

module MyModule {

    export class MyClass {
        ...
    }

}

Maintenant, j'ai créé un deuxième projet dans la même solution qui va être l'application réelle en utilisant ma bibliothèque nouvellement porté. Je dois comprendre ma bibliothèque en quelque sorte et je suppose que c'est ce que le système de module est pour. Cependant, je ne suis pas sûr de ce fichier (s) à importer en tant que MyModule est répartie sur des dizaines de fichiers. Est-ce que je peux utiliser le fichier .d.ts pour?

En outre, pour pouvoir importer un module, il doit être déclaré avec le mot-clé « export », mais si je fais ça, alors il ne se trouve pas par les commentaires de référence plus.

En plus de tout cela, les deux projets devraient être compilés afin que la sortie du compilateur peut être facilement utilisé avec un chargeur de modules comme requireJS.

Quelle est la meilleure approche pour accomplir tout cela?

Je vous remercie!

Créé 07/10/2012 à 16:41
source utilisateur
Dans d'autres langues...                            


1 réponses

voix
9

Ok, alors laissez-moi commencer par dire que « module » peut signifier des choses différentes. Par exemple, il y a le « motif de module » qui est ce que votre « MyModule » crée. Pour autant que je crois, tapuscrit fait référence à ces « modules internes » dans la spécification du langage, et ceux-ci diffèrent de « Modules externes » que vous chargerait avec quelque chose comme RequireJS. La principale distinction est que les modules externes attendent d'avoir leur propre environnement isolé avec l'objet 'exportations prédéfinies qu'ils peuvent utiliser pour exporter leur fonctionnalité.

Jetez un oeil à la sortie de votre module:

var MyModule;
(function (MyModule) {
    var MyClass = (function () {
        function MyClass() { }
        return MyClass;
    })();
    MyModule.MyClass = MyClass;    
})(MyModule || (MyModule = {}));

Vous voyez qu'il exporte les choses dans « MyModule » qui sera mis à la disposition d'autres à l'échelle mondiale script chargement des fichiers, par exemple, un bloc « script » html. Etant donné que vous avez mentionné que vous avez 60 d'entre eux, vous pouvez probablement mettre aussi le compilateur pour produire un seul fichier que vous pouvez inclure dans le balisage, au lieu de charger chaque fichier un par un.

Sur la route, jetez un oeil à ce qui se passe à la sortie si vous changez votre déclaration de module de « module MyModule {...} » à « module d'exportation MyModule {...} »:

(function (MyModule) {
    var MyClass = (function () {
        function MyClass() { }
        return MyClass;
    })();
    MyModule.MyClass = MyClass;    
})(exports.MyModule || (exports.MyModule = {}));

Comme vous le voyez, votre module utilise toujours le « modèle du module », mais il est affecté en tant que membre des « exportations », ce qui signifie qu'il est destiné à être chargé, par exemple, la fonction « exigent » du noeud.

Dans ce cas, vous voulez réellement utiliser votre module avec ce code:

import wrapper = module("./MyModule");
var instance = new wrapper.MyModule.MyClass();

Notez le nom « ./MyModule » fait référence au nom de fichier (moins l'extension .js) , le module est défini dans (ce qui est la raison pour laquelle VS a dit qu'il ne pouvait pas trouver ces modules pour vous). Le code devrait compiler à quelque chose comme:

var wrapper = require("./MyModule");
var instance = new wrapper.MyModule.MyClass();

Pour ajouter à cela, vous ne avez plus besoin même vraiment rien à faire avec le mot-clé « module » pour un module. Vous pouvez simplement exporter une fonction:

// foo.ts
export function foo() {
    ...
};

// some other file in the same dir
import wrapper = module("./foo");
var result = wrapper.foo();

Cela fonctionne parce que sera directement attribué « foo » la fonction de « exportations » qui sera à Aliased « wrapper » dans l'autre dossier.

Pour ajouter plus loin sur ce gâchis confus de choses liées à module, je dois aussi mentionner que les modules AMD sont différents encore parce qu'ils sont chargés de manière asynchrone, contrairement à noeud « exigent » de. Pour obtenir tapuscrit à la sortie ceux que vous aurez besoin de passer dans un paramètre « --module AMD » au compilateur.

Quoi qu'il en soit, je l'espère, j'ai expliqué la situation assez au point que vous serez en mesure de comprendre exactement ce dont vous avez besoin / besoin. Le type de modules que vous retrouvez à l'aide vraiment dépendra de la façon dont vous allez les utiliser ... par exemple, noeud, web, ou un mélange des deux.

Créé 07/10/2012 à 20:22
source utilisateur

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