这个有点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 install typescript”),它会公开对象。
exports.TypeScript = require("bin/typescript");
准备好了!现在你可以调用它并使用它编译你的代码。您可以在 tsc.js 文件中查看如何使用 API 进行编译。
我提前为前面的可怕代码道歉:
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、Close 和 Write 的方法,它们实际上只是包装器。您可能会因为必须添加此函数而产生开销,但您必须修改模块中的大量代码,这是不值得的。我认为最好有一个类来扩展(或者如果你还在 JS 上,继承原型)并让它为你做这件事,让它 DRY。
非常棒的一点是,如果您想翻译 500 个 TypeScript 文件并将它们全部放入一个 .js 文件中,您只需调用 compiler.addUnit(anothercontent, anotherpath); 500 次,然后将其全部放入一个文件中 :)
专注于更好的事情:如果你检查 tsc.js 代码,你会发现一个批处理编译器类。如果您希望将其用于构建过程,则最好使用类似它的更健壮的东西。它提供观看文件等。
浏览完代码,我想我只是向开发团队提交一张票,并要求他们提供更清晰的 API ¬¬
注意:这里的所有文件读取都是以同步方式完成的。就性能而言,这很糟糕,非常糟糕。我不确切知道您打算做什么,但是如果可能的话,我不能推荐您找到一种使此异步的方法。