Ok, dus laat ik beginnen met te zeggen dat "Module" verschillende dingen kan betekenen. Zo is er de "module patroon", dat is wat je "MyModule" creëert. Voor zover ik begrijp, Typescript verwijst naar deze als "Interne Modules" in de taal specificatie, en deze verschillen van "External Modules" die je zou worden geladen met iets als RequireJS. Het belangrijkste onderscheid is dat de externe modules verwachten om hun eigen geïsoleerde omgeving met een vooraf gedefinieerde 'export' object dat ze kunnen gebruiken voor hun functionaliteit exporteren hebben.
Neem een kijkje op de uitgang van de module:
var MyModule;
(function (MyModule) {
var MyClass = (function () {
function MyClass() { }
return MyClass;
})();
MyModule.MyClass = MyClass;
})(MyModule || (MyModule = {}));
Je ziet dat het exporteert dingen in "MyModule" die wereldwijd beschikbaar is voor andere script zal worden gemaakt bestanden u laden met, bijvoorbeeld, een html "script" block. Is dat u noemde je 60 van deze, zou je waarschijnlijk ook de compiler voor het uitvoeren van een enkel bestand dat je zou kunnen opnemen in markup, in plaats van het laden van elk bestand een voor een.
Bewegen op, neem een kijkje op wat er gebeurt met de uitgang als je je module verklaring te veranderen van "module MyModule {...}" naar "export module MyModule {...}":
(function (MyModule) {
var MyClass = (function () {
function MyClass() { }
return MyClass;
})();
MyModule.MyClass = MyClass;
})(exports.MyModule || (exports.MyModule = {}));
Zoals u ziet, is de module nog steeds met behulp van de "module patroon", maar het wordt toegewezen aan als lid van de "export", wat betekent dat het is bedoeld om te worden geladen met bijvoorbeeld knooppunt "nodig" -functie.
In dit geval zou u willen daadwerkelijk gebruik maken van uw module met deze code:
import wrapper = module("./MyModule");
var instance = new wrapper.MyModule.MyClass();
Let op de "./MyModule" naam verwijst eigenlijk naar de bestandsnaam (minus de extensie .js) de module wordt gedefinieerd in (dit is de reden waarom VS zei dat het kon niet die modules voor u te vinden). De code moet samenstellen om iets als:
var wrapper = require("./MyModule");
var instance = new wrapper.MyModule.MyClass();
Aan toe te voegen, zelfs niet meer echt nodig hebt u om iets te doen met de "module" keyword om een module te hebben. Je kon gewoon exporteren van een functie:
// foo.ts
export function foo() {
...
};
// some other file in the same dir
import wrapper = module("./foo");
var result = wrapper.foo();
Dit werkt omdat de functie 'foo' direct worden toegewezen aan "export", die zal worden alias naar "wrapper" in het andere bestand.
Om verder op deze verwarrende puinhoop van module gerelateerde dingen toe te voegen, moet ik ook vermelden dat AMD modules zijn steeds verschillend, omdat ze asynchroon worden geladen, in tegenstelling tot knooppunt "nodig". Om Typescript output die je nodig hebt om te passeren in een "--module AMD" parameter om de compiler te krijgen.
Hoe dan ook, ik hoop dat ik legde de situatie goed genoeg om het punt dat u zult in staat zijn om erachter te komen wat je precies nodig hebt / wilt. Het type van de modules eindig je met behulp zal echt afhankelijk van hoe je ze zult gebruiken ... dat wil zeggen, knoop, web, of een mix van beide.