编译多个Typescript文件

时间:2013-01-11 22:51:57

标签: javascript node.js compiler-construction webserver typescript

我的nodejs Typescript服务器的复杂性增加,现在依赖于另一个.ts文件中定义的几个类。这造成了一个奇怪的编译问题:

  • tsc server.ts编译好一切。但是node server.js崩溃了 从另一个.ts文件实例化一个类的第一行

  • tsc --out server.js server.ts会出现错误消息:“module 发射与发出的脚本碰撞“

  • tsc --out serv.js server.ts似乎有效但实际上是编译的 除了server.ts之外的一切。来自其他文件的代码就在那里,node serv.js只返回没有任何输出

我不是唯一有此错误的人,https://typescript.codeplex.com/workitem/294遗憾的是,codeplex上的解决方案对我不起作用。

如何正确使用tsc

2 个答案:

答案 0 :(得分:16)

您的server.ts依赖项需要是使用顶级export指令导出其表面区域的模块,server.ts应使用import指令加载它们。这里的根本原因是TypeScript有两种不同类型的Universe用于编译。

第一个是您用于常规网页的默认网页,其中一些简单的加载程序以某个固定顺序获取一个或多个源文件并按此顺序执行它们,并且您可以自己进行依赖项排序。这称为“ program ”编译。在程序编译中,您可以进行并行编译(a.ts => a.js,b.ts => b.js),或者您可以使用--out进行连接编译((a .ts + b.ts)=> out.js)。

程序编译中,您可以使用///<reference>标记来引用您的参考文献。如果这些引用是源文件(.ts),则如果使用--out,它们将连接到输出,否则将作为并排.js文件发送。如果这些引用是一个声明文件(.d.ts),那么你基本上就是说你将获得通过外部加载器加载的那些文件的定义(即浏览器中的<script>标记。)

第二种是您用于node.js或其他环境的编译,这些环境使用运行时依赖性解析来执行异步或幂等模块加载。这称为“模块”编译。这里,您传递给--module的{​​{1}}标志很重要,唯一有效的做法是并行编译,因为将一个文件作为模块加载(通常)模块加载器的方式在node.js等工作。

模块编译中,您在顶级对象(函数,类,模块,接口或var)上使用tsc关键字来控制引用的代码的可用内容你使用export。您应该只有import个标记指向/// <reference>声明文件,因为基于模块的运行时加载器没有加载裸JS文件的概念。您不会使用.d.ts进行编译。

从不想要混合和匹配这些编译模式,因为它根本不起作用。实际上,在0.8.2.0中,--out只会在您尝试执行此操作时发出错误。

答案 1 :(得分:0)

我有一个包含大量TypeScript文件的Web应用程序。以下是我解决这个问题的方法:

  1. 在〜/ Scripts目录中创建了一个全局_references.ts文件。对于Web项目中的每个ts文件,此文件都有引用路径= ...
  2. 接下来,我使用T4模板生成了这个文件,因为手动管理变得很麻烦。
  3. 另外,使用T4模板,我根据我的TypeScript依赖关系在 _references.ts 中对引用进行了排序。例如所有..Base.ts文件位于顶部。
  4. 另外,我创建了一个tsc参数文件,该文件以-out app.js开头,后跟项目中每个ts文件的列表。这也是使用T4生成的,我称之为 app.tsproj
  5. 最后,我调用 tsc @ app.tsproj 来生成正确排序所有依赖项的JavaScript。
  6. _references.ts T4模板:https://gist.github.com/danabenson/5224712

    app.tsproj T4模板:https://gist.github.com/danabenson/5224718