Acesta este un pic Hacky, dar va funcționa.
M-am gândit acest lucru foarte aceeași doar ieri și am fost verificat codul lor. Dacă bifați bin / typscript.js de la sourcecode lor (Acesta este un fișier foarte foarte mare, cu aproape 21k linii de cod), veți vedea că aceasta creează TypeScript.TypeScriptCompiler, iar apoi veți găsi că acest lucru nu expune o modalitate de compilare .
var compiler = new TypeScript.TypeScriptCompiler(outfile, errorfile,
new TypeScript.NullLogger(), settings);
Acum, aveți nevoie de o modalitate ușoară de a-l expune. Pentru a face acest lucru, va trebui să modificați codul lor, motiv pentru care acest lucru este hacky. Pentru a face acest lucru, ai putea modifica typescript.js adăugând:
module.exports = exports = TypeScript;
Chiar la sfârșitul fișierului.
Apoi, puteți crea un fișier index.js în rădăcina modulului (Notă: instalați modulul într-un domeniu de aplicare local, pentru toate acestea: „install NPM dactilografiat“), care expune obiectul.
exports.TypeScript = require("bin/typescript");
Și gata! Acum puteți apela doar și compila codul folosindu-l. Puteți verifica modul de a utiliza API-ul pentru compilarea în fișierul tsc.js.
Îmi cer scuze în avans pentru codul oribil înainte:
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();
Din anumite motive, cel care a scris codul a fost un fan real al C # și a început să meargă mai departe și metodele de utilizare numit WriteLine, Închide și să scrie, care sunt, de fapt, doar ambalaje. Ai putea obține acest overhead de a avea pentru a adăuga aceste funcții, dar ar trebui să modifice o mulțime de cod în modulul și nu este în valoare de ea. Cred că cel mai bine este de a avea o clasă să se extindă (sau dacă sunteți încă pe JS, moștenesc prototipul) și lăsați-o să facă acest lucru pentru tine, pentru a face uscat.
Ceva foarte frumos este că, dacă doriți să traduceți 500 de fișiere și să le typescript toate puse într-un singur fișier .js, puteți apela doar compiler.addUnit (anothercontent, anotherpath); De 500 de ori și apoi să vedem totul merge într-un singur fișier :)
Concentrându-se pe lucruri mai bune: dacă bifați tsc.js cod, veți găsi o clasă de compilator lot. Dacă doriți acest lucru pentru un proces de construcție, ar fi mai bine să utilizați ceva mai robust ca ea. Acesta oferă fișiere vizionarea și mai mult.
După ce a răsfoit codul, cred că voi depune doar un bilet la echipa de dezvoltare și de a le cere să furnizeze un API mai clar ¬¬
Notă: Toate fișierul citește aici se fac într-un mod sincron. Acest lucru este rău, foarte rău, în termeni de performanță. Nu știu exact ce aveți de gând să faci, dar nu am putut recomanda mai mult să găsească o modalitate de a face acest lucru, dacă este posibil asincronă.