Ok, så la meg begynne med å si at "Module" kan bety forskjellige ting. For eksempel er det "modul mønster" som er hva din "MyModule" skaper. Så vidt jeg samle, refererer Loggfila til disse som "Interne moduler" i språket spec, og disse skiller seg fra "Eksterne moduler" som du ville være lasting med noe sånt RequireJS. Hovedforskjellen er at eksterne moduler forvente å ha sitt eget isolert miljø med en forhåndsdefinert 'eksport' objekt de kan bruke for eksport deres funksjonalitet.
Ta en titt på utgangen av modulen:
var MyModule;
(function (MyModule) {
var MyClass = (function () {
function MyClass() { }
return MyClass;
})();
MyModule.MyClass = MyClass;
})(MyModule || (MyModule = {}));
Du ser at det er eksport ting inn "MyModule", som vil bli gjort globalt tilgjengelige for andre script filer du laster med, for eksempel en html "script" block. Å være at du nevnte du har 60 av disse, kan du sannsynligvis også sette kompilatoren å sende ut en enkelt fil som du kan inkludere i markeringen, i stedet for å laste inn filene én etter én.
Flytte på, ta en titt på hva som skjer med utgang hvis du endrer modul erklæring fra "modul MyModule {...}" til "eksport modul MyModule {...}":
(function (MyModule) {
var MyClass = (function () {
function MyClass() { }
return MyClass;
})();
MyModule.MyClass = MyClass;
})(exports.MyModule || (exports.MyModule = {}));
Som du ser, er modulen fortsatt bruke "modul mønster", men det blir tildelt som medlem av "eksport", som betyr at det er ment å være lastet med, for eksempel, nodes "krever" -funksjon.
I dette tilfellet ville du ønsker å faktisk bruke modul med denne koden:
import wrapper = module("./MyModule");
var instance = new wrapper.MyModule.MyClass();
Legg merke til "./MyModule" navn faktisk refererer til filnavnet (minus JS forlengelse) modulen er definert i (dette er grunnen til at VS sa det ikke kunne finne disse modulene for deg). Koden skal kompilere til noe sånt som:
var wrapper = require("./MyModule");
var instance = new wrapper.MyModule.MyClass();
For å legge til dette, trenger du ikke lenger selv virkelig trenger å gjøre noe med "modul" søkeord for å ha en modul. Du kan bare eksportere en funksjon:
// foo.ts
export function foo() {
...
};
// some other file in the same dir
import wrapper = module("./foo");
var result = wrapper.foo();
Dette fungerer fordi funksjonen 'foo' vil bli direkte tildelt "eksport", som vil bli overlapp til "wrapper" i den andre filen.
For å legge til ytterligere inn på dette forvirrende rot av modul relaterte ting, bør jeg også nevne at AMD modulene er forskjellige likevel fordi de er lastet asynkront, i motsetning nodes "krever". For å få typescript for å sende ut de som du må passere i en "--module AMD" parameter til kompilatoren.
Uansett, jeg håper jeg forklarte situasjonen godt nok til det punktet du vil være i stand til å finne ut hva du trenger / ønsker. Den type moduler du ende opp med å bruke virkelig vil avhenge av hvordan du skal bruke dem ... dvs. node, web, eller noen blanding av begge deler.