编译多个打字稿文件
我的nodejs Typescript服务器的复杂性已经增长,现在依赖于另一个.ts文件中定义的几个类。 这造成了一个奇怪的编译问题:
-
tsc server.ts
编译一切正常。 但是,node server.js
在第一行崩溃,从其他.ts文件实例化一个类 -
tsc --out server.js server.ts
导致错误消息:“模块发出与发出的脚本冲突” -
tsc --out serv.js server.ts
似乎工作,但实际上编译除了server.ts的一切。 来自其他文件的代码在那里,node serv.js
只是返回没有任何输出
我不是唯一一个这个错误, https: //typescript.codeplex.com/workitem/294不幸的是codeplex的解决scheme不适合我。
我如何正确使用tsc
?
你的server.ts
依赖项需要是模块,它们使用顶级export
指令导出它们的表面区域,而server.ts
应该使用import
指令来加载它们。 这里的根本原因是TypeScript有两种不同的编译Universe。
首先是默认的网页,一些简单的加载程序以一些固定的顺序接收一个或多个源文件并按照这个顺序执行它们,并且依靠您自己来进行依赖性sorting。 这就是所谓的“ 程序 ”编译。 在程序编译中,你可以并行编译(a.ts => a.js,b.ts => b.js),或者你可以使用--out
((a.ts + b) .ts)=> out.js)。
在程序编译中,你可以使用///<reference>
标签来引用你的引用。 如果这些引用是源文件( .ts
),那么如果使用--out
,它们将连接到输出,否则将作为并排.js
文件发送。 如果这些引用是声明文件( .d.ts
),那么基本上就是说你将获得通过外部加载器(即浏览器中的<script>
标记)加载的那些文件的定义。
第二种是用于node.js或其他环境的那种编译,它们通过运行时依赖parsing来执行asynchronous或幂等模块加载。 这被称为“ 模块 ”编译。 在这里,传递给tsc
的--module
标志很重要,唯一有效的做法是并行编译,因为将单个文件加载为模块通常是node.js中的模块加载器等工作。
在模块编译中,您可以使用顶级对象(函数,类,模块,接口或var)上的export
关键字来控制可用于使用import
引用的代码的内容。 您应该只有指向.d.ts
声明文件的/// <reference>
标记,因为基于模块的运行时加载程序没有加载裸露JS文件的概念。 你不会用--out
编译。
你永远不想混合和匹配这些编译模式,因为它根本不能工作。 事实上,在0.8.2.0中,如果你尝试这样做, tsc
将会发生一个错误。
我有一个很多的TypeScript文件的Web应用程序。 下面是我如何解决这个问题:
- 在〜/ Scripts目录下创build一个全局_references.ts文件。 这个文件有一个参考path= …在web项目中的每个ts文件。
- 接下来,我使用T4模板生成这个文件,因为它成为一个手工pipe理的痛苦。
- 此外,使用T4模板,我根据我的TypeScript依赖关系在_references.ts中定义了引用。 例如顶部的All ..Base.ts文件。
- 另外,我创build了一个tsc参数文件,该文件以-out app.js开始,接着是项目中每个ts文件的列表。 这也是使用T4生成的,我把它称为app.tsproj 。
- 最后,我调用tsc @ app.tsproj生成正确sorting的所有依赖关系的JavaScript。
_references.ts T4模板: https ://gist.github.com/danabenson/5224712
app.tsproj T4模板: https ://gist.github.com/danabenson/5224718