programing

클래스 생성자는 'new' 없이 호출할 수 없습니다. commonjs가 있는 typescript

batch 2023. 7. 5. 20:33
반응형

클래스 생성자는 'new' 없이 호출할 수 없습니다. commonjs가 있는 typescript

colysseus(노드 게임 서버 프레임워크)와 서버 사이드 채팅을 하고 있습니다.콜리세우스가 commonjs를 기반으로 하기 때문에 module:commonjs와 함께 typescript를 사용하고 있습니다.

저는 수업이 있어요.ChatRoom그것은 확장되는Colyseus.Room런타임에 다음 오류가 발생합니다.

Class constructor Room cannot be invoked without 'new'.

자바스크립트의 문제는 다음과 같습니다.

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 / tscconfig.json만 사용합니다.

TypeScript는 클래스를 ES5로 transcript지만 이 방법으로 전체 클래스 계층을 ES5로 transcript해야 합니다.

부모 클래스가 변환되지 않은 경우(Babel로 변환된 클래스를 포함하여 네이티브 클래스 또는 가져온 ES6 클래스), TypeScript가 다음에 의존하기 때문에 이는 작동하지 않습니다.var instance = Parent.call(this, ...) || this상위 생성자를 호출하기 위한 트릭, 반면 ES6 클래스는 다음을 통해서만 호출되어야 합니다.new.

이 문제는 Node.js에서 TypeScript 옵션을 다음으로 설정하여 해결해야 합니다.es6그 이상.최신 Node.js 버전은 ES6 클래스를 지원하므로 변환할 필요가 없습니다.

같은 문제가 바벨에게도 적용됩니다.

ts-node를 사용하는 사용자의 경우 다음과 같은 작업이 가능할 수 있습니다.tsconfig.jsonts-node에서 로드할 수 없습니다.

  1. 다음 옵션을 설정했는지 확인합니다.tsconfig.json:
{
    "compilerOptions": {
        "target": "ES6",
        ...
    }
}
  1. 해라ts-node --script-mode또는 사용--project경로를 지정합니다.tsconfig.json.

자바스크립트, 웹팩, 바벨(TypeScript 없음)을 사용하여 동일한 문제를 발견했습니다.

ES6/Babel Class Constructor 기반 솔루션이 'new' 없이는 호출될 수 없음을 발견했습니다.

저는 베이비 로더에 콜리세우스를 명시적으로 포함시켜야 했습니다.다음은 내 웹 팩 구성 파일의 스니펫입니다.

  module: {
    rules: [
      {
        test: /\.js$/,
        exclude: /node_modules/,
        include: /colyseus/,
        use: {
          loader: "babel-loader"
        }
      }
    ]
  },

언급URL : https://stackoverflow.com/questions/50203369/class-constructor-cannot-be-invoked-without-new-typescript-with-commonjs

반응형