我正在与 colyseus( Node 游戏服务器框架)进行服务器端聊天。我在 module:commonjs 中使用 typescript ,因为 colyseus 是建立在 commonjs 之上的。
我有类 ChatRoom
扩展 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");
}
}
当编译后删除问题行时,该错误很容易被跳过。但是没有创建基类,这不是一个完整的解决方案。
我用谷歌搜索了这个问题,它似乎与 babel 转译器有关,尽管我不使用 babel。我只使用 tsc/tsconfig.json。
最佳答案
TypeScript 将一个类转换为对应的 ES5 类,但这种方式有必要将整个类层次结构转换为 ES5。
如果父类未转译(原生类或导入的 ES6 类,包括使用 Babel 转译的类),这将不起作用,因为 TypeScript 依赖于 var instance = Parent.call(this, . ..) ||这个
技巧调用父构造函数,而 ES6 类应该只用 new
调用。
这个问题应该在 Node.js 中通过设置 TypeScript target
option 来解决。 es6
或更高版本。现代 Node.js 版本支持 ES6 类,无需转译它们。
同样的问题applies to Babel .
关于node.js - 没有 'new' 就无法调用类构造函数 - 带有 commonjs 的 typescript ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50203369/