9

我的 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 上的解决方案对我不起作用。

如何tsc正确使用?

4

2 回答 2

16

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

第一个是您用于常规网页的默认文件,其中一些简单的加载器以某种固定顺序获取 1 个或多个源文件并按该顺序执行它们,并且您自己进行依赖排序。这称为“程序”编译。在程序编译中,您可以进行并行编译 (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您传递的标志很tsc重要,唯一有效的做法是并行编译,因为将单个文件作为模块加载(通常)是 node.js 中的模块加载器等工作的方式。

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

永远不想混合和匹配这些编译模式,因为它根本行不通。事实上,在 0.8.2.0 中,tsc如果您尝试这样做,只会发出错误。

于 2013-01-12T00:15:59.390 回答
0

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

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

_references.ts T4 模板:https ://gist.github.com/danabenson/5224712

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

于 2013-03-22T21:03:58.247 回答