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 加载=]
- 确保您已为
tsconfig.json
设置以下选项:
{
"compilerOptions": {
"target": "ES6",
...
}
}
- 尝试
ts-node --script-mode
或使用 --project
指定 tsconfig.json
. 的路径
我正在与 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 加载=]
- 确保您已为
tsconfig.json
设置以下选项:
{
"compilerOptions": {
"target": "ES6",
...
}
}
- 尝试
ts-node --script-mode
或使用--project
指定tsconfig.json
. 的路径