Ответ 1
Этот бит немного взломан, но он будет работать.
Я подумал об этом совсем недавно, и я проверял их код. Если вы проверите bin/typscript.js со своим исходным кодом (это очень большой файл с почти 21k строками кода), вы увидите, что он создает TypeScript.TypeScriptCompiler, а затем вы обнаружите, что это ДЕЙСТВИТЕЛЬНО раскрывает путь компиляции.
var compiler = new TypeScript.TypeScriptCompiler(outfile, errorfile,
new TypeScript.NullLogger(), settings);
Теперь вам нужен простой способ разоблачить его. Чтобы сделать это, вам придется изменить свой код, поэтому он взломан. Для этого вы можете изменить TypeScript.js, добавив:
module.exports = exports = TypeScript;
В правой части файла.
Затем вы можете создать файл index.js в корневом модуле (обратите внимание: установите модуль в локальной области для всего этого: "npm install typescript" ), который предоставляет объект.
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();
По какой-то причине тот, кто написал код, был настоящим поклонником С# и продолжил работу и использовал методы, называемые WriteLine, Close и Write, которые на самом деле просто обертки. Вы можете получить из этого накладные расходы, связанные с необходимостью добавления этих функций, но вам придется модифицировать много кода в модуле, и это не стоит. Я думаю, что лучше всего расширить класс (или если вы все еще на JS, наследуете прототип), и пусть это сделает это для вас, чтобы сделать его сухим.
Что-то действительно приятное в том, что если вы хотите перевести 500 файлов TypeScript и поместить их все в один .js файл, вы можете просто вызвать compiler.addUnit(anothercontent, anotherpath); 500 раз, а затем увидеть все это в один файл:)
Фокусировка на лучших вещах: если вы проверите код tsc.js, вы найдете класс компилятора пакета. Если вы хотите, чтобы это было для процесса сборки, лучше было бы использовать что-то более надежное. Он обеспечивает просмотр файлов и многое другое.
Просматривая код, я думаю, что просто отправлю билет команде разработчиков и попрошу предоставить более четкий API ¬¬
Примечание. Все файлы, которые читаются здесь, выполняются синхронно. Это плохо, очень плохо, с точки зрения производительности. Я точно не знаю, что вы планируете делать, но я не могу рекомендовать больше, чтобы найти способ сделать этот асинхронный, если это возможно.