编译多个Typescript文件

9
我的nodejs Typescript服务器变得越来越复杂,现在依赖于另一个.ts文件中定义的几个类。这导致了一个奇怪的编译问题:
  • tsc server.ts编译一切正常。但是node server.js在实例化其他.ts文件中的类的第一行代码处崩溃。

  • tsc --out server.js server.ts会出现错误信息:"module emit collides with emitted script"

  • tsc --out serv.js server.ts似乎可以工作,但实际上只编译了除server.ts以外的所有内容。其他文件的代码都在其中,但node serv.js没有任何输出。

我不是唯一遇到这个错误的人,https://typescript.codeplex.com/workitem/294不幸的是,codeplex上的解决方案对我无效。

我该如何正确使用tsc

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或其他环境使用的编译方法。这称为“模块”编译。在这里,您传递给tsc--module标志很重要,唯一有效的操作是并排编译,因为以单个文件作为模块进行加载(通常)是node.js等模块加载器的工作方式。在 模块 编译中,您可以在顶层对象(函数、类、模块、接口或变量)上使用 export 关键字来控制可供使用 import 引用的代码。您应该仅有指向 .d.ts 声明文件的 /// <reference> 标签,因为基于模块的运行时加载器不具备加载裸的 JS 文件的概念。您不会使用 --out 进行编译。
绝对不能混合使用这些编译模式,因为它根本不起作用。事实上,在 0.8.2.0 版本中,tsc 如果您尝试这样做,将直接发出错误。

1
谢谢您的出色回答。我终于明白何时使用模块和何时使用引用路径了。 - lhk
你是否可以提供一些使用你的答案的示例呢?我正在尝试使用Phaser.io+TypeScript来处理多个文件,但是当我运行我的应用程序时,在第二个文件中,我有一个扩展Namespace.Class的类,但是我收到一个错误,说找不到Namespace。 - Michel Tomé

0

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

  1. 在~/Scripts目录下创建了一个全局的_references.ts文件。该文件中为Web项目中的每个ts文件添加了一个reference path=...
  2. 接下来,我使用T4模板生成了此文件,因为手动管理变得很麻烦。
  3. 同时,使用T4模板,我按照我的TypeScript依赖项对_references.ts中的引用进行了排序。例如,所有..Base.ts文件都在顶部。
  4. 此外,我创建了一个tsc参数文件,该文件以-out app.js开头,后跟项目中的每个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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接