Node.js 类构造函数不能在没有';新';-带有commonjs的typescript

Node.js 类构造函数不能在没有';新';-带有commonjs的typescript,node.js,typescript,commonjs,Node.js,Typescript,Commonjs,我正在与colyseus(节点游戏服务器框架)进行服务器端聊天。我将typescript与module:commonjs一起使用,因为colyseus是基于commonjs构建的 我有一个扩展了Colyseus.Room的类聊天室。 在运行时,我遇到以下错误: Class constructor Room cannot be invoked without 'new'. javascript的问题是: function ChatRoom() { return _super !== nul

我正在与colyseus(节点游戏服务器框架)进行服务器端聊天。我将typescript与module:commonjs一起使用,因为colyseus是基于commonjs构建的

我有一个扩展了Colyseus.Room的类
聊天室
。 在运行时,我遇到以下错误:

Class constructor Room cannot be invoked without 'new'.
javascript的问题是:

function ChatRoom() {
   return _super !== null && _super.apply(this, arguments) || this;
}
从typescript类:

import {Room} from "colyseus";

export class ChatRoom extends Room {

    onInit(options) {
        console.log("BasicRoom created!", options);
    }

    onJoin(client) {
        this.broadcast(`${ client.sessionId } joined.`);
    }

    onLeave(client) {
        this.broadcast(`${ client.sessionId } left.`);
    }

    onMessage(client, data) {
        console.log("BasicRoom received message from", client.sessionId, ":", data);
        this.broadcast(`(${ client.sessionId }) ${ data.message }`);
    }

    onDispose() {
        console.log("Dispose BasicRoom");
    }
  }
编译后删除有问题的行时,很容易跳过该错误。但是基类没有被创建,这不是一个完整的解决方案


我在谷歌上搜索了这个问题,它似乎与巴贝尔transpiler有关,尽管我没有使用巴贝尔。我只使用tsc/tsconfig.json。

TypeScript将类传输到它的ES5对应项,但这样就需要将整个类层次结构传输到ES5

如果父类未转换(本机类或导入的ES6类,包括使用Babel传输的类),这将不起作用,因为TypeScript依赖于调用父构造函数的
var instance=parent.call(this,…)|
技巧,而ES6类只应使用
new
调用

这个问题应该在Node.js中通过将TypeScript设置为
es6
或更高来解决。现代Node.js版本支持ES6类,不需要传输它们


同样的问题。

我在使用javascript、webpack和babel(但没有TypeScript)时遇到了同样的问题

我找到了一个基于

我需要在我的巴别塔加载器中明确地包含colyseus。以下是我的网页包配置文件中的代码段:

  module: {
    rules: [
      {
        test: /\.js$/,
        exclude: /node_modules/,
        include: /colyseus/,
        use: {
          loader: "babel-loader"
        }
      }
    ]
  },
对于正在使用的用户,您的
tsconfig.json
可能无法通过ts节点加载

  • 确保为
    tsconfig.json
    设置了以下选项:
  • 尝试
    ts节点--script模式
    或使用
    --project
    指定
    tsconfig.json的路径

  • 谢谢这可以工作:tsconfig.compilerOptions:{target:“es6”,…}…或者,如果需要es5支持,请确保所有层次结构都是使用target:es5编译的。我的两分钱!这帮了我的忙,谢谢!这解决了我的问题!我不得不从ES5转换到ES6,结果成功了
        {
            "compilerOptions": {
                "target": "ES6",
                ...
            }
        }