これは少しハックですが、うまくいきます。
昨日も同じことを考えていて、彼らのコードをチェックしていました。ソースコードから bin/typscript.js を確認すると (これは非常に大きなファイルで、21,000 行近くのコードがあります)、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();
何らかの理由で、コードを書いた人は C# の真のファンであり、実際には単なるラッパーである WriteLine、Close、および Write と呼ばれるメソッドを使用するようになりました。この関数を追加しなければならないというオーバーヘッドを得ることができますが、モジュール内の多くのコードを変更する必要があり、その価値はありません。拡張するクラスを用意し (または、まだ JS を使用している場合はプロトタイプを継承し)、それを実行させて DRY にするのが最善だと思います。
本当に素晴らしいのは、500 個の TypeScript ファイルを変換してそれらすべてを 1 つの .js ファイルに入れたい場合、単に compiler.addUnit(anothercontent, anotherpath); を呼び出すことができるということです。500回、それがすべて単一のファイルに入るのを見てください:)
より良いことに焦点を当てる: tsc.js コードをチェックすると、バッチ コンパイラ クラスが見つかります。ビルド プロセスでこれが必要な場合は、このようなより堅牢なものを使用することをお勧めします。ファイルの監視などを提供します。
コードを閲覧したので、開発チームにチケットを送信して、より明確な API を提供するよう依頼するだけだと思います ¬¬
注: ここでのすべてのファイルの読み取りは、同期的に行われます。これは、パフォーマンスの点で悪い、非常に悪いです。あなたが何をしようとしているのか正確にはわかりませんが、可能であれば、これを非同期にする方法を見つけることをお勧めできません。