Typoskript: Mehrere Projekte in Lösung

stimmen
10

Ich habe in all seinen 60 Klassen eine JavaScript-Bibliothek zu Typoskript in Visual Studio 2012. Alle fertig zu portieren, wobei jede Klasse in einer eigenen .ts-Datei definiert.

Alle Klassen sind in demselben Modul definiert. Ich benutze Referenz Kommentare zu den Klassen in anderen Dateien definiert Reder. Das Layout jeder Datei sieht wie folgt aus:

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

module MyModule {

    export class MyClass {
        ...
    }

}

Jetzt habe ich ein zweites Projekt in der gleichen Lösung geschaffen, die die tatsächliche Anwendung mit meiner neu portierte Bibliothek sein werden. Ich muss meine Bibliothek irgendwie sind und ich denke, das ist es, was das Modulsystem ist für. Aber ich bin nicht sicher, welche Datei (en) zu importieren als MyModule Dutzende von Dateien verteilt wird. Ist das, was ich die .d.ts Datei für nicht verwenden kann?

Auch in die Lage sein, ein Modul zu importieren, hat es mit dem ‚Export‘ Schlüsselwort deklariert werden, aber wenn ich das tun, dann wird es nicht durch Verweis Kommentare mehr gefunden.

Am Anfang aller, dass, sollten beiden Projekte zusammengestellt werden, so dass die Compiler Ausgabe leicht mit einem Modul-Lader wie requireJS verwendet werden kann.

Was ist der beste Ansatz, all dies zu erreichen?

Vielen Dank!

Veröffentlicht am 07/10/2012 um 16:41
quelle vom benutzer
In anderen Sprachen...                            


1 antworten

stimmen
9

Ok, so lassen Sie mich zunächst sagen, dass „Modul“ verschiedene Dinge bedeuten kann. Zum Beispiel gibt es das „Modul Muster“, das ist das, was Ihre „MyModule“ erstellt. Soweit ich sammeln, bezieht sich Typoskript auf diese als „Interne Module“ in der Sprache spec, und diese unterscheiden sich von „Externe Module“, die Sie wie RequireJS mit etwas werden geladen würde. Der Hauptunterschied besteht darin, dass externe Module ihre eigene isolierte Umgebung mit einer vordefinierten ‚Ausfuhr‘ Objekt haben, erwarten sie für den Export ihre Funktionalität nutzen.

Werfen Sie einen Blick auf die Ausgabe des Moduls:

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

Sie sehen, dass es Dinge in „MyModule“ exportiert, die auf andere Skript global zur Verfügung gestellt werden Dateien, die Sie laden mit zum Beispiel einem html „Skript“ -Block. Ist, dass Sie erwähnt haben Sie 60 davon haben, könnten Sie wahrscheinlich setzen die Compiler auch eine einzelne Datei ausgeben, die Sie im Markup enthalten könnten, anstatt jede Datei einzeln geladen werden.

Umzug auf, werfen Sie einen Blick auf das, was mit dem Ausgang passiert, wenn Sie Ihre Moduldeklaration ändern von „Modul MyModule {...}“ auf „Export-Modul MyModule {...}“:

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

Wie Sie sehen, ist das Modul immer noch mit dem „Modul Muster“, sondern es als Mitglied der „Exporte“ zugewiesen wird, was bedeutet, dass sie mit zum Beispiel geladen werden soll, wird der Knoten der Funktion „erfordern“.

In diesem Fall würden Sie tatsächlich Ihr Modul mit diesem Code verwenden:

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

Beachten Sie die „./MyModule“ Name bezieht sich tatsächlich auf den Dateinamen (minus der Erweiterung .js) das Modul in definiert ist ( aus diesem Grund VS sagte es nicht , diese Module für Sie finden konnten). Der Code sollte wie etwas kompilieren:

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

Um diese Erweiterung, die Sie nicht mehr selbst wirklich brauchen etwas mit dem „Modul“ Schlüsselwort zu tun, um ein Modul zu haben. Sie könnten einfach eine Funktion exportieren:

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

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

Das funktioniert, weil die ‚foo‘ Funktion wird auf „Exporte“ direkt zugeordnet werden, die in der anderen Datei zu „Wrapper“ aliased werden.

Um weiter auf dieses verwirrenden Durcheinander von Modul bezogene Dingen hinzufügen, soll ich auch erwähnen, dass AMD Module unterschiedlich ist nach wie vor, weil sie asynchron geladen werden, im Gegensatz zu Knotens „erfordern“. Um Typoskript ausgeben müssen diejenigen, werden Sie in einer „--module AMD“ Parameter an den Compiler zu übergeben.

Wie auch immer, ich hoffe, dass ich die Situation gut genug, um den Punkt erklärt Sie werden in der Lage sein, herauszufinden, was genau Sie brauchen / wollen. Die Art der Module, die Sie mit am Ende wird wirklich davon ab, wie Sie sie verwenden werden ... dh Knoten, Web, oder eine Mischung aus beidem.

Beantwortet am 07/10/2012 um 20:22
quelle vom benutzer

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