TypeScript是否为NodeJS模块访问提供了明确的公共API?

从一个节点应用程序我想要做的:

var typeScript = require('typescript'); typeScript.compile('...') 

我正在寻找实现编译器到生成系统,但没有访问公共API(typescript.compile等),这是不可能的。

下面是我想要做的更完整的例子,虽然下面是针对LiveScript,而不是TypeScript,在为Brunch.io构build系统编写的插件中使用:

 LiveScript = require 'LiveScript' sysPath = require 'path' module.exports = class LiveScriptCompiler brunchPlugin: yes type: 'javascript' extension: 'ls' constructor: (@config) -> null compile: (data, path, callback) -> try result = LiveScript.compile data, bare: yes catch err error = err finally callback error, result include: [ (sysPath.join __dirname, '..', 'vendor', 'prelude-browser-0.6.0.js') ] 

好奇,如果有人find解决办法?

更新

我最终实现了自己的解决scheme,解决了上面和其他地方列出的各种问题。 有关更多信息和用法,请参阅https://github.com/damassi/TypeScript-Watcher 。

       

网上收集的解决方案 "TypeScript是否为NodeJS模块访问提供了明确的公共API?"

这一个是有点哈克,但它会工作。

我昨天就想到了这一点,我正在检查他们的代码。 如果你从源代码中检查bin / typscript.js(这是一个非常大的文件,有近21k行代码),你会看到它创build了TypeScript.TypeScriptCompiler,然后你会发现这样做暴露了一种编译方式。

 var compiler = new TypeScript.TypeScriptCompiler(outfile, errorfile, new TypeScript.NullLogger(), settings); 

现在,你需要一个简单的方法来暴露它。 要做到这一点,你将不得不修改他们的代码,这就是为什么这是hacky。 要做到这一点,你可以修改typescript.js通过添加:

 module.exports = exports = TypeScript; 

在文件的最后

然后,你可以在模块的根目录下创build一个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,inheritance原型),并让它为你做,干掉它。

真正好的是,如果你想翻译500个TypeScript文件并把它们全部放到一个.js文件中,你可以调用compiler.addUnit(anothercontent,anotherpath); 500次,然后看到这一切进入一个单一的文件:)

专注于更好的东西:如果你检查tsc.js代码,你会发现一个批处理编译器类。 如果你想要这个构build过程,可能会更好地使用像这样更强大的东西。 它提供了观看文件和更多。

浏览了代码之后,我想我只是向开发团队提交一张票,要求他们提供一个更清晰的API¬¬

注意:这里读取的所有文件都是以同步方式完成的。 在性能方面这是糟糕的,非常糟糕的。 我不知道你打算做什么,但我不能推荐更多,如果可能的话,你find一种方法来使这种asynchronous。

目前不可能仅仅通过require和calling编译来实现编译。 如果你能看到harness.ts有一个编译器模块,提供了一个相当简单的方法,但我build议你从外部调用tsc。

 ///<reference path='node.d.ts'/> import exec = module('child_process'); var child = exec.exec('tsc foo.ts', function (error, stdout, stderr) { if (error !== null) { console.log('exec error: ' + error); } }); 

我相信这会做这个工作。

通过niutech检查这个github项目 ,它可以在浏览器中将TypeScript代码转换为JS代码,但是我想可以很容易地将其修改为在node.js中工作。

更好的要求可以帮助你实现这一点,如果你想要的是执行/访问打字稿文件。

它可以让你需要()打字稿文件 – 不需要预编译 – 以及一堆其他文件格式(coffeescript,clojurescript,yaml,xml等)

 require('better-require')(); var myModule = require('./mymodule.ts'); 

披露:我写了更好的要求。

你可以试试https://github.com/sinclairzx81/typescript.api 。 这个项目执行require()扩展的东西,但也有一些手动编译ts源的function。 应该可以用它创build一个自动构build系统。

注意它build立在打字稿0.9编译器上,所以你可能会也可能没有成功地编译0.8.3源代码给出各种语言的更新。