我的 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
?
最佳答案
您的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”编译。在这里,--module
您传递给 tsc
的标志很重要,唯一有效的做法是并行编译,因为将单个文件作为模块加载是(通常)node.js 等模块加载器的工作方式。
在模块编译中,你使用export
顶级对象(函数、类、模块、接口(interface)或变量)上的关键字,以控制对使用 import
引用您的代码可用的内容.你应该只拥有 /// <reference>
指向 .d.ts
的标签声明文件,因为基于模块的运行时加载器没有加载裸 JS 文件的概念。您不会使用 --out
进行编译.
你从不想要混合和匹配这些编译模式,因为它根本行不通。事实上,在 0.8.2.0 中,tsc
如果您尝试这样做,只会发出错误。
关于javascript - 编译多个 Typescript 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14287954/