我的nodejs Typescript服务器的复杂性增加,现在依赖于另一个.ts文件中定义的几个类。这造成了一个奇怪的编译问题:
tsc server.ts
编译好一切。但是node server.js
崩溃了
从另一个.ts文件实例化一个类的第一行
tsc --out server.js server.ts
会出现错误消息:“module
发射与发出的脚本碰撞“
tsc --out serv.js server.ts
似乎有效但实际上是编译的
除了server.ts之外的一切。来自其他文件的代码就在那里,node serv.js
只返回没有任何输出
我不是唯一有此错误的人,https://typescript.codeplex.com/workitem/294遗憾的是,codeplex上的解决方案对我不起作用。
如何正确使用tsc
?
答案 0 :(得分:16)
您的server.ts
依赖项需要是使用顶级export
指令导出其表面区域的模块,server.ts
应使用import
指令加载它们。这里的根本原因是TypeScript有两种不同类型的Universe用于编译。
第一个是您用于常规网页的默认网页,其中一些简单的加载程序以某个固定顺序获取一个或多个源文件并按此顺序执行它们,并且您可以自己进行依赖项排序。这称为“ program ”编译。在程序编译中,您可以进行并行编译(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
的{{1}}标志很重要,唯一有效的做法是并行编译,因为将一个文件作为模块加载(通常)模块加载器的方式在node.js等工作。
在模块编译中,您在顶级对象(函数,类,模块,接口或var)上使用tsc
关键字来控制引用的代码的可用内容你使用export
。您应该只有import
个标记指向/// <reference>
声明文件,因为基于模块的运行时加载器没有加载裸JS文件的概念。您不会使用.d.ts
进行编译。
你从不想要混合和匹配这些编译模式,因为它根本不起作用。实际上,在0.8.2.0中,--out
只会在您尝试执行此操作时发出错误。
答案 1 :(得分:0)
我有一个包含大量TypeScript文件的Web应用程序。以下是我解决这个问题的方法:
_references.ts T4模板:https://gist.github.com/danabenson/5224712
app.tsproj T4模板:https://gist.github.com/danabenson/5224718