没有'new'就不能调用类构造函数-带有commonjs的打字稿

新手上路,请多包涵

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

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

 Class constructor Room cannot be invoked without 'new'.

以及javascript中的麻烦:

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

来自打字稿类:

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

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

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

原文由 Александър К. 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 450
2 个回答

TypeScript 将一个类转译为对应的 ES5,但这样就需要将整个类层次结构转译为 ES5。

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

这个问题应该在 Node.js 中通过将 TypeScript target 选项 设置为 es6 或更高来解决。现代 Node.js 版本支持 ES6 类,无需转换它们。

同样的问题 也适用于 Babel

原文由 Estus Flask 发布,翻译遵循 CC BY-SA 4.0 许可协议

对于那些使用 ts-node 的人,您的 tsconfig.json 可能无法被 ts-node 加载。

  1. 确保为 tsconfig.json 设置了以下选项:
 {
    "compilerOptions": {
        "target": "ES6",
        ...
    }
}

  1. 尝试 ts-node --script-mode 或使用 --project 指定你的路径 tsconfig.json

原文由 Devo 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题