我正在与 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 许可协议
TypeScript 将一个类转译为对应的 ES5,但这样就需要将整个类层次结构转译为 ES5。
如果父类未转译(本机类或导入的 ES6 类,包括使用 Babel 转译的类),这将不起作用,因为 TypeScript 依赖
var instance = Parent.call(this, ...) || this
调用父构造函数的技巧,而 ES6 类只能用new
调用。这个问题应该在 Node.js 中通过将 TypeScript
target
选项 设置为es6
或更高来解决。现代 Node.js 版本支持 ES6 类,无需转换它们。同样的问题 也适用于 Babel 。