Dette er litt Hacky men det vil fungere.
Jeg tenkte på denne samme i går, og jeg skulle sjekke koden sin. Hvis du sjekker bin / typscript.js fra deres kildekode (Det er en veldig veldig stor fil, med nesten 21k linjer med kode), vil du se det skaper TypeScript.TypeScriptCompiler, og da vil du finne at dette ikke utsetter en måte å kompilere .
var compiler = new TypeScript.TypeScriptCompiler(outfile, errorfile,
new TypeScript.NullLogger(), settings);
Nå trenger du en enkel måte å avsløre det. For å gjøre dette, må du endre koden sin, og det er derfor dette er Hacky. For å gjøre dette, kan du endre typescript.js ved å legge til:
module.exports = exports = TypeScript;
Helt på slutten av filen.
Deretter kan du opprette en index.js fil i roten av modulen (varsel: installere modulen i en lokal omfang for alt dette: "NPM installere Loggfila"), som eksponerer objektet.
exports.TypeScript = require("bin/typescript");
Og klar! Nå kan du bare kalle det og kompilere koden ved å bruke det. Du kan sjekke hvordan du bruker API for kompilering i tsc.js filen.
Jeg beklager på forhånd for fryktelig kode fremover:
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();
Av en eller annen grunn den som skrev koden var en ekte fan av C # og fortsatte å gå videre og bruker metoder kalt Writeline, Lukk og skrive, som faktisk bare wrappers. Du kan få dette av overhead for å måtte legge dette fungerer, men du må endre mye kode i modulen, og det er ikke verdt det. Jeg tror det er best å ha en klasse for å forlenge (eller hvis du fortsatt er på JS, arve prototype) og la den gjøre det for deg, for å gjøre den tørr.
Noe veldig hyggelig er at hvis du ønsker å oversette 500 Loggfila filer og sette dem alle i én JS-fil, kan du bare ringe compiler.addUnit (anothercontent, anotherpath); 500 ganger og deretter se det hele gå inn i en enkelt fil :)
Med fokus på bedre ting: hvis du sjekker tsc.js kode, vil du finne en batch kompilator klasse. Hvis du ønsker dette for et byggeprosessen, kan det være bedre å bruke noe mer robust som det. Det gir se filer og mer.
Etter å ha bladd koden, jeg tror jeg vil bare sende en billett til utviklingsteamet og be dem om å gi en klarere API ¬¬
Merk: Alle fil leser her er gjort i en synkron måte. Dette er dårlig, veldig dårlig, med tanke på ytelse. Jeg vet ikke nøyaktig hva du har tenkt å gjøre, men jeg kunne ikke anbefale mer at du finner en måte å gjøre dette async hvis mulig.