Αυτό και μόνο είναι λίγο Hacky, αλλά αυτό θα λειτουργήσει.
Σκέφτηκα για αυτό το ίδιο ακριβώς χθες και είχα τον έλεγχο του κώδικά τους. Εάν έχετε ελέγξει bin / typscript.js από πηγαίο κώδικα τους (Είναι ένα πολύ πολύ μεγάλο αρχείο, με σχεδόν 21k γραμμές κώδικα), θα δείτε δημιουργεί TypeScript.TypeScriptCompiler, και τότε θα διαπιστώσετε ότι αυτό δεν εκθέτουν έναν τρόπο κατάρτισης .
var compiler = new TypeScript.TypeScriptCompiler(outfile, errorfile,
new TypeScript.NullLogger(), settings);
Τώρα, θα πρέπει να έχετε έναν εύκολο τρόπο για να το εκθέσει. Για να το κάνετε αυτό, θα πρέπει να τροποποιήσουν τον κώδικά τους, η οποία είναι ο λόγος για αυτό είναι Hacky. Για να το κάνετε αυτό, μπορείτε να τροποποιήσετε typescript.js προσθέτοντας:
module.exports = exports = TypeScript;
Δικαίωμα στο τέλος του αρχείου.
Στη συνέχεια, μπορείτε να δημιουργήσετε ένα index.js αρχείο στη ρίζα της μονάδας (σημείωση: εγκαταστήσετε τη μονάδα σε ένα τοπικό πεδίο για όλα αυτά: «NPM εγκατάσταση γραφομηχανή»), η οποία εκθέτει το αντικείμενο.
exports.TypeScript = require("bin/typescript");
Και έτοιμο! Τώρα μπορείτε να την αποκαλούν απλώς και καταρτίζουν τον κωδικό σας χρήση. Μπορείτε να ελέγξετε τον τρόπο χρήσης του API για τη σύνταξη του φακέλου tsc.js.
Ζητώ συγγνώμη εκ των προτέρων για το φρικτό κωδικό μέλλον:
var fs = require("fs");
var TypeScript = require("typescript");
var path = "test.ts";
var pathout = "test.js";
var content = fs.readFileSync(path, "utf-8");
var fd = fs.openSync(pathout, 'w');
var outFile = {
Write: function (str) {
fs.writeSync(fd, str);
},
WriteLine: function (str) {
console.log(fd, str);
fs.writeSync(fd, str + '\r\n');
},
Close: function () {
fs.closeSync(fd);
fd = null;
}
};
var createFile = function (path) {
function mkdirRecursiveSync(path) {
var stats = fs.statSync(path);
if(stats.isFile()) {
throw "\"" + path + "\" exists but isn't a directory.";
} else {
if(stats.isDirectory()) {
return;
} else {
mkdirRecursiveSync(_path.dirname(path));
fs.mkdirSync(path, 509);
}
}
}
mkdirRecursiveSync(_path.dirname(path));
console.log(path)
var fd = fs.openSync(path, 'w');
return {
Write: function (str) {
fs.writeSync(fd, str);
},
WriteLine: function (str) {
fs.writeSync(fd, str + '\r\n');
},
Close: function () {
fs.closeSync(fd);
fd = null;
}
};
};
var stderr = {
Write: function (str) {
process.stderr.write(str);
},
WriteLine: function (str) {
process.stderr.write(str + '\n');
},
Close: function () {
}
}
var compiler = new TypeScript.TypeScriptCompiler(outFile, outFile);
compiler.setErrorOutput(stderr);
compiler.addUnit(content, path);
compiler.typeCheck();
compiler.emit(false, createFile);
outFile.Close();
Για κάποιο λόγο όποιος έγραψε τον κωδικό που ήταν ένας πραγματικός οπαδός του C # και προχώρησε για να πάει μπροστά και να χρησιμοποιούν μεθόδους που ονομάζεται WriteLine, Κλείσιμο και να γράφουν, τα οποία είναι στην πραγματικότητα μόνο περιτυλίγματα. Θα μπορούσατε να πάρετε αυτό της εναέριας να πρέπει να προσθέσετε αυτό λειτουργεί, αλλά θα πρέπει να τροποποιήσετε πολλά κώδικα στη λειτουργική μονάδα και δεν αξίζει τον κόπο. Νομίζω ότι το καλύτερο είναι να έχουμε μια τάξη για να επεκτείνουν (ή αν είστε ακόμα στο JS, κληρονομούν το πρωτότυπο) και αφήστε το να κάνει αυτό για σας, ώστε να είναι στεγνό.
Κάτι πολύ ωραίο είναι ότι αν θέλετε να μεταφράσετε 500 γραφομηχανή αρχεία και τα βάζουμε όλα σε ένα ενιαίο αρχείο .js, μπορείτε απλά να καλέσετε compiler.addUnit (anothercontent, anotherpath)? 500 φορές και στη συνέχεια να δούμε όλα πάνε σε ένα ενιαίο αρχείο :)
Εστίαση σε καλύτερα πράγματα: αν έχετε ελέγξει tsc.js κωδικό, θα βρείτε μια κατηγορία παρτίδα compiler. Αν θέλετε αυτό για μια διαδικασία κατασκευής, θα μπορούσε να είναι καλύτερο να χρησιμοποιήσετε κάτι πιο ισχυρό σαν αυτό. Παρέχει βλέποντας τα αρχεία και πολλά άλλα.
Έχοντας βιαστικά τον κωδικό, νομίζω ότι θα υποβάλει μόνο ένα εισιτήριο για την ομάδα ανάπτυξης και να τους ζητήσει να παρέχει μια σαφέστερη API ¬¬
Σημείωση: Όλα αρχείο διαβάζει εδώ μέσα γίνονται με σύγχρονο τρόπο. Αυτό είναι κακό, πολύ κακό, όσον αφορά τις επιδόσεις. Δεν ξέρω ακριβώς τι σκοπεύετε να κάνετε, αλλά δεν θα μπορούσα να συστήσω περισσότερο που μπορείτε να βρείτε έναν τρόπο να κάνουν αυτό το ασύγχρονη αν είναι δυνατόν.