当前位置: 首页 > 面试题库 >

没有'new'-不能调用类构造函数-commonjs的Typescript

严宏朗
2023-03-14
问题内容

我正在与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 transpiler有关,尽管我不使用babel。我只使用tsc / tsconfig.json。


问题答案:

TypeScript将类转换为其对应的ES5,但是通过这种方式,有必要将整个类层次结构转换为ES5。

如果父类是未编译的(本机类或导入的ES6类,包括使用Babel进行编译的类),则此方法将不起作用,因为TypeScript依赖于var instance = Parent.call(this, ...) || this技巧来调用父构造函数,而ES6类应仅使用调用new

这个问题应该在Node.js的设置打字稿来解决target选项来es6。现代的Node.js版本支持ES6类,无需转换它们。预设设置为节点目标。



 类似资料:
  • 我正在做一个项目(Next.js 8.1.0版),我想升级到9.2版。接下来我换了衣服。js版本到9.2,我遇到了这个问题: 类型错误:类构造函数应用程序不能被调用没有新的在新的MyApp(/home/节点/应用程序/src/. Next/服务器/静态/开发/页面/_app.js:4384: 191)在处理孩子(/home/节点/应用程序/node_modules/react-dom/cjs/re

  • 问题内容: 我有一门用Javascript ES6编写的类。当我尝试执行命令时,我总是会看到此错误 完整错误如下所述: 我想做的是,我创建了一个类,然后创建了该类的实例。然后,我试图导出该变量。 类结构定义如下: 我如何尝试导出变量-> 您可以在此处找到完整的代码> https://hastebin.com/kecacenita.js Babel生成的代码> https://hastebin.co

  • 为什么下面没有编译: 如有需要,请提供更多详细信息: 我想将tmp传递给父构造函数

  • 问题内容: 我在一个Activity中有一个IntentService,当我尝试调用该服务时,它将引发此错误,我发现这很奇怪,因为如果我声明了空的构造函数。 错误: AndroidManifest.xml 活动: 问题答案: 你是一个内部阶级。如果要将其保留在内部,请将其更改为static: 您可能需要阅读不同类型的嵌套类。google的第一个链接:http : //docs.oracle.com

  • 问题内容: 只有最后一部分(我的意思是我仅对此有问题) 当我编译它时,我没有合适的构造函数错误。为什么是这样??顺便说一下,Spirtokouto类的目的是要增加一个计数值(权重)。我可以将一个班级扩展到> 1个班级吗? 问题答案: Box类有两个构造函数:,但它们都不带四个参数,而您要用四个参数来调用它,因此请更改此参数: 对此: 调用必须首先在构造函数中进行。 我可以将一个班级扩展到 > 1个

  • 问题内容: 如果我有一个像这样的抽象类: 还有一些从Item派生的类是这样的: 我不明白为什么我不能使用泛型调用构造函数: 我知道可以有一个没有构造函数的类型,但是这种情况是不可能的,因为Pencil具有没有参数的构造函数,而Item是抽象的。但是我从eclipse中得到了这个错误: 无法实例化 我不明白为什么的 T类型 ,以及如何避免这种情况? 问题答案: 无法使用Java类型系统来强制类层次结