Конструктор класса не может быть вызван без 'new' - машинописный текст с commonjs - PullRequest
0 голосов
/ 06 мая 2018

Я делаю чат на стороне сервера с Colyseus (узел игрового сервера). Я использую машинопись с модулем: 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");
    }
  }

Ошибка легко пропускается при удалении проблемной строки после компиляции. Но базовый класс не создан, и это не полное решение.

Я гуглил проблему, и, похоже, это связано с транспортерами вавилона, хотя я не использую вавилон. Я использую только tsc / tsconfig.json.

Ответы [ 2 ]

0 голосов
/ 11 марта 2019

Я столкнулся с той же проблемой, используя javascript, webpack и babel (но без TypeScript).

Я нашел решение на основе ES6 / Babel Class конструктор не может быть вызван без 'new'

Мне нужно было явно включить Колизей в мой загрузчик Babel. Ниже приведен фрагмент файла конфигурации моего веб-пакета:

  module: {
    rules: [
      {
        test: /\.js$/,
        exclude: /node_modules/,
        include: /colyseus/,
        use: {
          loader: "babel-loader"
        }
      }
    ]
  },
0 голосов
/ 06 мая 2018

TypeScript передает класс своему аналогу ES5, но для этого необходимо, чтобы вся иерархия классов переносилась в ES5. В случае, если родительский класс не перенесен (собственный класс или импортированный класс ES6, включая те, которые были перенесены с помощью Babel), это не будет работать, потому что TypeScript использует трюк var instance = Parent.call(this, ...) || this для вызова родительского конструктора, в то время как классы ES6 должны вызываться только с new.

Эта проблема должна быть решена в Node.js путем установки TypeScript target option в es6. Современные версии Node.js поддерживают классы ES6, их не нужно переносить.

...