TypeScript使用typescript-require共享文件

我使用TypeScript来编写我的JavaScript文件与面向对象编程。 我想使用节点模块https://npmjs.org/package/typescript-require从其他文件中获取我的.ts文件。

我想在服务器和客户端共享我的文件。 (浏览器)这非常重要。 请注意,文件夹/共享/并不意味着客户端和服务器之间,而是游戏服务器和Web服务器之间共享。 我使用pomelo.js作为框架,这就是为什么。

目前我没有使用(成功)打字稿需要库。 我喜欢这样做:

共享/ LIB / message.js

var Message = require('./../classes/Message'); module.exports = { getNewInstance: function(message, data, status){ console.log(requireTs);// Global typescript-require instance console.log(Message); return new Message(message, data, status); } }; 

这个文件需要Message.js来创build新的实例。

共享/类/消息。 TS

 class Message{ // Big stuff } try{ module.exports = Message; }catch(e){} 

在fil的最后,我添加这个try / catch来将类添加到module.exports(如果存在)。 (它工作,但它不是一个真正的好办法,我想做得更好)如果我从浏览器加载文件,module.export将不存在。

所以,我上面做的是工作。 现在,如果我尝试使用打字稿需求模块,我会改变一些事情:

共享/ LIB / message.js

 var Message = requireTs('./../classes/Message.ts'); 

我使用requireTs而不是require,这是一个全局variables。 我确切地说我正在使用.ts文件。

共享/类/消息。 TS

 export class Message{ // Big stuff } // remove the compatibility script at the end 

现在,如果我尝试这样,如果我看看控制台服务器,我得到requireTs是对象和消息未定义在共享/ lib / message.js 。 如果我不使用Message中的export关键字,我会得到相同的结果。 ts 。 即使我最后使用我的小脚本,我总是会有一个错误。

但是还有更多,我有另一个类名ValidatorMessage。 ts 扩展消息。 如果我使用导出关键字,它不工作…

我做错了吗? 我尝试了几个其他的东西,但没有任何工作,看起来像typescript-require不能要求.ts文件。 感谢您的帮助。

查看打字稿需求库,我发现它已经9个月没有更新了。 因为它包含了键入typeScript(和node.d.tstypes)的核心的lib.d.ts,并且由于这些在过去9个月中已经取得了很大的进展(伴随着语言更新所需的更改),它可能不兼容与最新的TypeScript版本(只是我的假设,我可能是错的)。

在TypeScript中,在Node和浏览器之间共享模块并不容易,因为它们都使用非常不同的模块系统(Node中的CommonJS,通常在浏览器中像RequireJS)。 TypeScript根据给定的–module开关发出一个或另一个的代码。 (注意:有些人使用通用模块定义(UMD)模式,但TypeScript不直接支持这个模式)。

你试图达到什么目标,我可能会提供一些指导。

我正在做同样的事情,不pipe有什么办法,我都试图做事…对我来说主要的问题是:

  • 我写我的打字机作为命名空间和组件,所以没有导出模块与多个文件编译,你必须做一个hack添加一些_exporter.ts在最后添加导出为您的library-output.js是可导入的作为模块,这将需要像这样的东西:

module.exports.MyRootNamespace = MyRootNamespace

  • 如果你做了上面的工作,然而你会得到什么时候需要引用其他模块的类(例如MyRootNamespace2.SomeOtherClass引用的MyRootNamespace1.SomeClass)的问题,你可以引用它,但它会将它编译到你的library-output2.js文件,所以如果你试图在多个编译目标中重复使用打字稿(比如你将在VS中有1个解决scheme,还有多个具有自己的dll输出的项目),你最终会得到重复的类。

  • 假设你不喜欢黑客出口和/或复制你的引用,那么你可以将它们导入到全局范围,这是一个黑客,但工程…然而,当你决定要testing你的代码(使用任何nodejstesting框架),您将需要嘲笑某些事情,因为组件的依赖关系可能不会通过require()调用包含进来(并且您的模块可能依赖于node_modules,这对于全局范围黑客来说并不是真的可用)使得很难满足依赖性和模拟某些特定的依赖性,就像是一种全然的或者没有的方式。

  • 最后,你可以尝试通过使用打字稿框架(如appex)来缓解所有这些问题,它允许你直接运行你的打字稿,而不是先编译成js,尽pipe看起来非常好,但是很难debugging编译错误,这是目前我的首选方式,但我有一个问题,我的打字稿通过TSC编译罚款,但只是在最大的堆栈大小的exception,在appex,我受到项目维护人员的摆布这个(我不能find潜在的问题)。 这里也没有太多这样的项目,但是在模块级别/文件级别编译这个问题是一个有争议的问题。

最终,我没有任何东西,只是尝试与Typescript摔跤的问题,使其工作在可维护和可testing的方式。 我也试图重新使用客户端上的一些打字稿组件,但是如果你沿着npm黑客路线去包含你的模块,那么你必须确保你的客户端使用一个兼容的资源/包装载器。 尽pipe我很喜欢在我的客户端和我的服务器项目上使用打字稿,但似乎并不希望以一种很好的方式工作。

解决scheme在这里: inheritanceTypeScript和导出的类和模块

最后,我不使用require-typescript,而是使用typescript.api ,它运行良好。 (如果使用它,必须加载lib.d.ts ,否则在控制台上会出现一些错误。

我还没有一个解决scheme在浏览器上有脚本。 (由于导出关键字我有一些错误客户端)我想添加一个出口全球variables,以避免这样的错误。

谢谢你的帮助。