【问题标题】:Compiling multiple Typescript files编译多个 Typescript 文件
【发布时间】:2012-12-26 14:42:53
【问题描述】:

我的 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

【问题讨论】:

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


    【解决方案1】:

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

    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

    【讨论】:

      【解决方案2】:

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

      第一个是您用于常规网页的默认值,其中一些简单的加载器以某个固定顺序获取 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--module 标志很重要,唯一有效的做法是并行编译,因为将单个文件作为模块加载(通常)是node.js 中的模块加载器的方式等工作。

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

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

      【讨论】:

      • 感谢您的出色回答。终于明白什么时候用模块什么时候用引用路径了
      • 您是否可以使用您的答案提供一些示例?我正在尝试使用 Phaser.io+TypeScript 拥有多个文件,但是当我运行我的应用程序时,在第二个文件中我有一个扩展 Namespace.Class 的类,但我收到一条错误消息,提示找不到命名空间。
      猜你喜欢
      • 1970-01-01
      • 2019-07-17
      • 1970-01-01
      • 2013-03-29
      • 2012-10-07
      • 1970-01-01
      • 1970-01-01
      • 2012-10-30
      • 2016-12-05
      相关资源
      最近更新 更多