Porównaj ceny domen i usług IT, sprzedawców z całego świata

Nie można wywołać konstruktora klasy bez „nowego” - maszynopisu używającego commonjs


Prowadzę czat na serwerze z colyseusem (framework serwera gry node). Używam maszynopisu z modułem: commonjs, ponieważ colyseus jest zbudowany na commonjs.
Mam klasę
ChatRoom
, która rozszerza
Colyseus.Room
.
W czasie wykonywania otrzymuję ten błąd:
Class constructor Room cannot be invoked without 'new'.

A problem tkwi w javascript:
function ChatRoom() {
return _super !== null && _super.apply(this, arguments) || this;
}

z klasy maszynopisu:
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");
}
}

Błąd można łatwo przeoczyć, gdy problematyczna linia zostanie usunięta po kompilacji. Nie utworzono jednak żadnej klasy bazowej i nie jest to kompletne rozwiązanie.
Wyszukałem w Google ten problem i wydaje się, że jest on związany z transpilerem Babel, chociaż nie używam Babel. Używam tylko tsc/tsconfig.json.
Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

TypeScript przenosi klasę do jej odpowiednika z ES5, ale w związku z tym wymaga przeniesienia całej hierarchii klas do ES5.
W przypadku, gdy klasa nadrzędna nie zostanie przetransportowana (klasa natywna lub zaimportowana klasa ES6, w tym te transponowane za pomocą Babel), nie zadziała, ponieważ TypeScript opiera się na
trick var instance = Parent.call (this, ...) || this
, aby wywołać konstruktor nadrzędny, podczas gdy klasy ES6 powinny być wywoływane tylko z
new
.
Ten problem powinien zostać rozwiązany w Node.js przez ustawienie

parametr
https://www.typescriptlang.org ... .html
Używane maszynopis
Cel
do ES6 . Nowoczesne wersje klas ES6 Node.js. Nie ma potrzeby transplan.
ustawienie wstępne jest ustawione na węzeł docelowy.
Ten sam problem

dotyczy również Babilonu
https://coderoad.ru/51860043/
.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Napotkałem ten sam problem używając javascript, webpack i babel (ale nie TypeScript).
Znalazłem rozwiązanie oparte na

Nie można wywołać konstruktora klasy ES6/Babel bez 'new'
https://coderoad.ru/44625868/
Musiałem wyraźnie dołączyć Koloseum do mojego babilońskiego programu ładującego. Poniżej znajduje się fragment kodu w moim pliku konfiguracyjnym pakietu internetowego:
module: {
rules: [
{
test:/\.js$/,
exclude:/node_modules/,
include:/colyseus/,
use: {
loader: "babel-loader"
}
}
]
},
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Dla tych, którzy używają

ts-node
https://github.com/TypeStrong/ts-node
jest całkiem możliwe, że twój
tsconfig.json
nie może zostać załadowany przez ts-node.

Najpierw upewnij się, że ustawiłeś poniższą opcję dla
tsconfig.json
:
{
"compilerOptions": {
"target": "ES6",
...
}
}

Następnie możesz spróbować
ts-node --script-mode
lub użyć
--project
, aby określić ścieżkę do swojego
tsconfig.json
.

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się