Javascript TypeScript使用TypeScript需要共享文件

Javascript TypeScript使用TypeScript需要共享文件,javascript,node.js,typescript,Javascript,Node.js,Typescript,我使用TypeScript用面向对象编程来编写javascript文件。 我想使用节点模块从其他文件中获取我的.ts文件 我想在服务器端和客户端共享我的文件。(浏览器)这非常重要。请注意,文件夹/shared/不是指客户端和服务器之间的共享,而是指游戏服务器和Web服务器之间的共享。我使用pomelo.js作为框架,这就是为什么 目前我没有(成功地)使用typescript require库。 我喜欢这样: shared/lib/message.js 此文件需要Message.js来创建新实例

我使用TypeScript用面向对象编程来编写javascript文件。 我想使用节点模块从其他文件中获取我的.ts文件

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

目前我没有(成功地)使用typescript require库。 我喜欢这样:

shared/lib/message.js

此文件需要Message.js来创建新实例

共享/类/消息。ts

在fil的末尾,我添加了这个try/catch,以将该类添加到module.exports(如果存在)中。(这是可行的,但这不是一个好办法,我想做得更好) 如果从浏览器加载文件,module.export将不存在

所以,我上面所做的就是工作。现在,如果我尝试使用typescript require模块,我将更改一些内容:

shared/lib/message.js

我使用requireTs而不是require,它是一个全局变量。我使用的是.ts文件

共享/类/消息。ts

现在,如果我像这样尝试,并且查看控制台服务器,我会得到requireTs is object,而Message在shared/lib/Message.js中是未定义的。 如果我在消息中不使用export关键字,我会得到相同的结果。ts。即使我在最后使用我的小脚本,我总是会得到一个错误

但还有更多,我有另一个类名ValidatorMessage。ts扩展了消息。ts,如果我使用export关键字,它将不起作用

我做错什么了吗?我尝试了其他几种方法,但没有任何效果,看起来typescript require无法要求.ts文件。
谢谢您的帮助。

查看typescript require库,我发现它已经9个月没有更新了。由于它包括TypeScript的核心lib.d.ts类型(以及node.d.ts类型),并且在过去9个月内取得了巨大的进步(以及由于语言更新而需要的更改),它可能与最新的TypeScript版本不兼容(只是我的假设,我可能错了)

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

您到底想要实现什么目标,我可以提供一些指导。

解决方案:

最后,我没有使用require-typescript,但它工作得很好。(如果使用它,必须加载lib.d.ts,否则控制台上会出现一些错误

我还没有一个在浏览器上安装脚本的解决方案(由于export关键字,我在客户端遇到了一些错误),我想添加一个exports全局变量来避免这样的错误


谢谢你的帮助,比尔。

我也在做同样的事情,无论我怎么做都会遇到问题……我的主要问题是:

  • 我以名称空间和组件的形式编写我的typescript,因此没有包含多个文件编译的导出模块。您必须在末尾添加一些_exporter.t来添加导出,以便将
    库输出.js
    作为一个模块导入,这将需要以下内容:
module.exports.MyRootNamespace=MyRootNamespace

  • 但是,如果您执行上述操作,则会遇到一个问题:何时需要引用其他模块中的类(例如MyRootNamespace1.SomeClass被MyRootNamespace2.SomeOtherClass引用)您可以引用它,但它会将它编译到您的
    library-output2.js
    文件中,因此,如果您试图跨多个编译的目标重用typescript,那么您最终会得到重复的类(就像在VS中有一个解决方案和多个具有自己的dll输出的项目一样)

  • 假设您不喜欢破解导出和/或复制引用,那么您可以将它们导入到全局范围,这是一种破解,但很有效……但是,当您决定测试代码时(使用任何nodejs测试框架)您将需要模拟某些东西,因为组件的依赖关系可能不会通过
    require()
    调用包含在内(并且您的模块可能依赖于无法真正用于全局范围黑客攻击的节点\u模块)这使得满足依赖关系和模仿某些依赖关系变得很困难,就像是一种要么全有要么全无的方法

  • 最后,您可以尝试通过使用typescript框架来缓解所有这些问题,例如,它允许您直接运行您的typescript,而不是先编译到js中,虽然这看起来很好,但很难调试编译错误,这是目前我首选的方法,但我有一个问题,我的typescript比较通过tsc,iles很好,但在appex上出现了一个最大堆栈大小异常,我要由项目维护人员来解决这个问题(我无法找到根本的问题)。这类项目也不多,但它们使在模块级/文件级编译等问题变得毫无意义

最终,我在尝试与Typescript搏斗以使其以可维护和可测试的方式工作时遇到了问题。我还尝试在客户端重复使用一些Typescript组件。但是,如果您通过npm黑客路线将模块包括在内,那么您必须确保您的客户端使用<代码>需要
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);
    }
};
class Message{
    // Big stuff
}
try{
    module.exports = Message;
}catch(e){}
var Message = requireTs('./../classes/Message.ts');
export class Message{
    // Big stuff
}
// remove the compatibility script at the end