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.