我正在与colyseus(节点游戏服务器框架)进行服务器端聊天。我正在使用带有模块的typescript: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;
}
来自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 transpiler有关,虽然我不会使用babel。我只使用tsc / tsconfig.json。
答案 0 :(得分:10)
TypeScript将类转换为其ES5对应物,但这样就必须将整个类层次结构转换为ES5。如果父类是未传输的(本机类或导入的ES6类,包括用Babel转换的类),这将不起作用,因为TypeScript依赖于var instance = Parent.call(this, ...) || this
技巧来调用父构造函数,而ES6类应该是仅使用new
进行调用。
通过将TypeScript target
option设置为es6
,可以在Node.js中解决此问题。现代Node.js版本支持ES6类,无需转换它们。
答案 1 :(得分:1)
对于正在使用ts-node的用户,很有可能ts-node无法加载您的tsconfig.json
。
首先,请确保您为tsconfig.json
设置了以下选项:
{
"compilerOptions": {
"target": "ES6",
...
}
}
然后,您可以尝试ts-node --script-mode
或使用--project
指定到tsconfig.json
的路径。