Ten jest nieco hacky, ale to będzie działać.
Myślałem o tym samym tylko wczoraj i byłem sprawdzanie ich kodu. Jeśli zaznaczysz bin / typscript.js z ich kodu źródłowego (Jest to bardzo duży plik, z prawie 21k linii kodu), widać, że tworzy TypeScript.TypeScriptCompiler, a następnie okaże się, że to robi narazić sposób kompilowania ,
var compiler = new TypeScript.TypeScriptCompiler(outfile, errorfile,
new TypeScript.NullLogger(), settings);
Teraz trzeba łatwy sposób narażać. Aby to zrobić, trzeba będzie zmodyfikować swój kod, który jest dlaczego to hacky. Aby to zrobić, można modyfikować typescript.js dodając:
module.exports = exports = TypeScript;
Prawo na końcu pliku.
Następnie można utworzyć plik index.js w głównym modułu (Uwaga: należy zainstalować moduł w lokalnym zakresie za to wszystko: „npm zainstalować maszynopis”), które wystawia przedmiot.
exports.TypeScript = require("bin/typescript");
I gotowy! Teraz można tylko nazwać i skompilować kod używając go. Można sprawdzić, w jaki sposób korzystać z interfejsu API do kompilacji w pliku tsc.js.
Przepraszam z góry za okropny kodu przed:
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();
Z jakiegoś powodu ten, kto napisał kod był prawdziwym fanem C # i zaczął iść do przodu i metod mechanicznych nazywa WriteLine, Close i zapisu, które są w rzeczywistości tylko owijarki. Można dostać to od napowietrznej konieczności dodawania tej funkcji, ale trzeba by zmodyfikować dużo kodu w module, a to nie jest tego warte. Myślę, że najlepiej jest mieć klasę rozszerzenia (lub jeśli jesteś wciąż na JS, dziedziczyć prototyp) i niech to zrobić dla Ciebie, aby go wysuszyć.
Coś naprawdę miłe jest to, że jeśli chcesz przetłumaczyć 500 maszynopis pliki i umieścić je wszystkie w jednym pliku .js, można po prostu zadzwonić compiler.addUnit (anothercontent, anotherpath); 500 razy, a następnie sprawdzić to wszystko iść w jednym pliku :)
Skupiając się na lepszych rzeczy: jeśli zaznaczysz tsc.js kod znajdziesz klasę kompilatora partii. Jeśli chcesz, to dla procesu kompilacji, to może być lepiej użyć coś bardziej solidnego podoba. Zapewnia oglądania plików i więcej.
Po przeglądałem kod, myślę, że po prostu przesłać zgłoszenie do zespołu projektowego i poprosić ich, aby zapewnić jaśniejsze API ¬¬
Uwaga: Wszystkie pliki czyta tutaj odbywa się w sposób synchroniczny. Jest źle, bardzo źle, jeśli chodzi o wydajność. Nie wiem dokładnie, co masz zamiar zrobić, ale nie mogę polecić bardziej, że można znaleźć sposób, aby to asynchronicznie jeśli to możliwe.