Εντάξει, οπότε επιτρέψτε μου να ξεκινήσω λέγοντας ότι «Ενότητα» μπορεί να σημαίνει διαφορετικά πράγματα. Για παράδειγμα, υπάρχει το «σχέδιο ενότητας», η οποία είναι ό, τι δημιουργεί «mymodule» σας. Σε ό, τι κατάλαβα, γραφομηχανή αναφέρεται σε αυτά ως «εσωτερική Ενότητες» στη γλώσσα spec, και αυτά διαφέρουν από «εξωτερικές μονάδες» που θα φόρτωση με κάτι σαν RequireJS. Η κύρια διαφορά είναι ότι οι εξωτερικές μονάδες αναμένουν να έχουν τη δική τους απομονωμένο περιβάλλον με αντικείμενο ένα προκαθορισμένο «εξαγωγές» που μπορούν να χρησιμοποιήσουν για την εξαγωγή λειτουργικότητά τους.
Ρίξτε μια ματιά στην έξοδο της μονάδας σας:
var MyModule;
(function (MyModule) {
var MyClass = (function () {
function MyClass() { }
return MyClass;
})();
MyModule.MyClass = MyClass;
})(MyModule || (MyModule = {}));
Θα δείτε ότι εξάγει τα πράγματα σε «mymodule», η οποία θα γίνει σε παγκόσμιο επίπεδο και σε άλλα script αρχεία σας φορτώσει με, για παράδειγμα, ένα html «σενάριο» μπλοκ. Είναι ότι αναφέρατε έχετε 60 από αυτούς, θα μπορούσατε πιθανώς επίσης να ρυθμίσετε το compiler για την έξοδο ένα αρχείο που θα μπορούσατε να συμπεριλάβετε στο σήμανσης, αντί για τη φόρτωση κάθε αρχείου μία προς μία.
Προχωρώντας, ρίξτε μια ματιά στο τι συμβαίνει στην έξοδο εάν αλλάξετε τη δήλωση της μονάδας σας από το «mymodule ενότητα {...}» στο «mymodule μονάδα εξαγωγής {...}»:
(function (MyModule) {
var MyClass = (function () {
function MyClass() { }
return MyClass;
})();
MyModule.MyClass = MyClass;
})(exports.MyModule || (exports.MyModule = {}));
Όπως μπορείτε να δείτε, μονάδα σας εξακολουθεί να χρησιμοποιεί το «σχέδιο ενότητα» αλλά να ανατεθεί ως μέλος των «εξαγωγών», που σημαίνει ότι είναι γραφτό να φορτωθεί με, για παράδειγμα, τον κόμβο του «απαιτούν» λειτουργία.
Σε αυτήν την περίπτωση, θα θέλετε να χρησιμοποιήσετε στην πραγματικότητα μονάδα σας με αυτόν τον κωδικό:
import wrapper = module("./MyModule");
var instance = new wrapper.MyModule.MyClass();
Σημειώστε το όνομα «./MyModule» αναφέρεται στην πραγματικότητα στο όνομα αρχείου (μείον την επέκταση .js) η μονάδα ορίζεται στο (αυτός είναι ο λόγος VS έλεγε ότι δεν μπορούσε να βρει αυτές τις ενότητες για σας). Ο κώδικας θα πρέπει να καταρτίζουν σε κάτι σαν:
var wrapper = require("./MyModule");
var instance = new wrapper.MyModule.MyClass();
Για να προσθέσετε σε αυτό, δεν μπορείτε πλέον ακόμη και πραγματικά χρειάζεται να κάνετε τίποτα με τη λέξη-κλειδί «ενότητα» για να έχουν μια μονάδα. Θα μπορούσατε απλά να εξάγουν μια συνάρτηση:
// foo.ts
export function foo() {
...
};
// some other file in the same dir
import wrapper = module("./foo");
var result = wrapper.foo();
Αυτό λειτουργεί, επειδή η λειτουργία «foo» θα ανατεθεί απευθείας στην «εξαγωγή», η οποία θα ψευδώνυμο «περιτύλιγμα» στο άλλο αρχείο.
Για να προσθέσετε περαιτέρω σε αυτή την σύγχυση χάος που σχετίζονται μονάδας πράγματα, θα ήθελα επίσης να αναφέρω ότι μονάδων AMD είναι διαφορετικές ακόμα επειδή είναι φορτωμένα ασύγχρονα, σε αντίθεση με κόμβου «απαιτούν». Για να πάρετε γραφομηχανή για την έξοδο εκείνα που θα πρέπει να περάσει σε μια παράμετρο «--module AMD» για τον compiler.
Τέλος πάντων, ελπίζω ότι εξήγησα την κατάσταση αρκετά καλά μέχρι το σημείο θα είστε σε θέση να καταλάβω τι ακριβώς χρειάζεστε / θέλετε. Ο τύπος των μονάδων που καταλήγουν να χρησιμοποιούν θα εξαρτηθεί πολύ από το πώς θα πρέπει να τα χρησιμοποιούν ... δηλαδή, κόμβος, web, ή κάποιο συνδυασμό των δύο.