Class 没有 'new' 就无法调用构造函数 - 带有 commonjs 的打字稿

Class constructor cannot be invoked without 'new' - typescript with commonjs

我正在与 colyseus(节点游戏服务器框架)进行服务器端聊天。我在 module:commonjs 中使用打字稿,因为 colyseus 是建立在 commonjs 之上的。

我有 class ChatRoom 扩展 Colyseus.Room。 在 运行 时我收到此错误:

Class constructor Room cannot be invoked without 'new'.

javascript中的麻烦:

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

来自打字稿 class:

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");
    }
  }

编译后去掉问题行,很容易跳过这个错误。但是基础 class 没有创建,这不是一个完整的解决方案。

我用谷歌搜索了这个问题,它似乎与 babel 转译器有关,尽管我不使用 babel。我只使用 tsc / tsconfig.json.

TypeScript 将 class 转译为其对应的 ES5,但这样就必须将整个 class 层次结构转译为 ES5。

如果父 class 未转译(原生 class 或导入的 ES6 class,包括使用 Babel 转译的),这将不起作用,因为 TypeScript 依赖在 var instance = Parent.call(this, ...) || this 技巧上调用父构造函数,而 ES6 classes 应该只用 new.

调用

此问题应在 Node.js 中通过将 TypeScript target option 设置为 es6 或更高版本来解决。现代 Node.js 版本支持 ES6 classes,无需转译它们。

同样的问题

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

我找到了一个基于

我需要在我的 babel 加载程序中明确包含 colyseus。下面是我的 webpack 配置文件中的片段:

  module: {
    rules: [
      {
        test: /\.js$/,
        exclude: /node_modules/,
        include: /colyseus/,
        use: {
          loader: "babel-loader"
        }
      }
    ]
  },

对于那些正在使用 ts-node 的用户,您的 tsconfig.json 可能无法被 ts-node.[=17 加载=]

  1. 确保您已为 tsconfig.json 设置以下选项:
{
    "compilerOptions": {
        "target": "ES6",
        ...
    }
}
  1. 尝试 ts-node --script-mode 或使用 --project 指定 tsconfig.json.
  2. 的路径