Javascript 编译多个Typescript文件

Javascript 编译多个Typescript文件,javascript,node.js,compiler-construction,webserver,typescript,Javascript,Node.js,Compiler Construction,Webserver,Typescript,我的nodejs Typescript服务器变得越来越复杂,现在依赖于另一个.ts文件中定义的几个类。这就产生了一个奇怪的编译问题: tsc server.ts可以很好地编译所有内容。但是node server.js在 从另一个.ts文件实例化类的第一行 tsc--out server.js server.ts导致错误消息:“模块 发射与发射的脚本冲突“ tsc--out serv.js server.ts似乎可以工作,但实际上可以编译 除了server.ts之外的所有内容。其他文件中的代码就

我的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
    只是返回,没有任何输出

我不是唯一一个有这个错误的人,不幸的是codeplex上的解决方案不适合我


如何正确使用
tsc
服务器?

您的
服务器。ts
依赖项需要是使用顶级
导出
指令导出其表面积的模块,并且
服务器。ts
应使用
导入
指令加载它们。这里的根本原因是TypeScript有两种不同类型的编译宇宙

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

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

第二种是编译类型,可用于node.js或其他使用运行时依赖项解析进行异步或幂等模块加载的环境。这称为“模块”编译。在这里,传递给
tsc
--module
标志很重要,唯一有效的方法是并行编译,因为将单个文件作为模块加载(通常)是node.js中的模块加载程序的工作方式,等等

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


您从来都不想混合和匹配这些编译模式,因为它根本不起作用。事实上,在0.8.2.0中,
tsc
如果您尝试执行此操作,只会发出一个错误。

我有一个web应用程序,其中包含大量的TypeScript文件。下面是我如何解决这个问题的:

  • 在~/Scripts目录中创建了一个全局_references.ts文件。此文件具有引用路径=。。。对于web项目中的每个ts文件
  • 接下来,我使用T4模板生成了这个文件,因为手工管理它变得很麻烦
  • 此外,使用T4模板,我根据我的TypeScript依赖关系在_references.ts中对引用进行了排序。e、 g.所有..Base.ts文件位于顶部
  • 此外,我还创建了一个tsc参数文件,该文件以-out app.js开头,后面是项目中每个ts文件的列表。这也是使用T4生成的,我称之为app.tsproj
  • 最后,我调用tsc@app.tsproj生成所有依赖项顺序正确的JavaScript
  • _references.ts T4模板:


    app.tsproj T4模板:

    感谢您的回答。最后,我终于明白了什么时候使用模块,什么时候使用参考路径。你能用你的答案提供一些例子吗?我试图使用Phaser.io+TypeScript创建多个文件,但是当我运行我的应用程序时,在第二个文件中,我有一个扩展Namespace.class的类,但是我收到一个错误,说找不到Namespace。