typescript - "Inte en konstruktor" fel med bibliotek och angular
Jag försöker bygga en Angular-applikation för ett schackspel. Jag vill använda biblioteket chess.js https://github.com/jhlywa/chess.js/blob/master/README.md med typerna som deklareras i https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/chess.js Men varje gång jag kör applikationen uppstår ett fel vid körning.
Jag har installerat paketen via npm med
npm install --save chess.js @types/chess.js
Och i tjänsten som använder biblioteket har jag den här relevanta koden:
import {Chess, ChessInstance} from "chess.js"
@Injectable({
providedIn: 'root'
})
export class GameService {
private chess: ChessInstance = new Chess()
constructor() {}
...
}
Felet jag får är:
core.js:15724 ERROR Error: Uncaught (in promise): TypeError: chess_js__WEBPACK_IMPORTED_MODULE_4__.Chess is not a constructor
TypeError: chess_js__WEBPACK_IMPORTED_MODULE_4__.Chess is not a constructor
Jag har också försökt importera det som:
import * as Chessjs from "chess.js"
@Injectable({
providedIn: 'root'
})
export class GameService {
private chess: Chessjs.ChessInstance = new Chessjs.Chess()
constructor() {}
...
}
Utan framgång.
Jag har också försökt deklarera chess.js från min app.module.ts, men det verkar vara fel sätt att importera icke-modul-skript
All hjälp skulle uppskattas mycket
Svar #1
Jag kan inte få det att fungera med typerna eftersom Chess inte är definierad som en class utan som en const
så avinstallera först typer:
npm uninstall --save @types/chess.js
och sedan använda det så här.
import * as Chess from "chess.jschess:any = new Chess();det enda problemet är att du inte kommer att ha typerna (testade och fungerande)
UPPDATERING
baserat på detta svar med modifieringar, så att din redigerare känner igen typerna, skulle du kunna göra med de installerade typerna
import { ChessInstance } from 'chess.js'
ChessReq:any = require('chess.js');
Chess:ChessInstance = new this.ChessReq();
använd sedan Chess.header() till exempel med typerna som visas i din editor
(testad och fungerar också)
Svar #2
Inget av de andra svaren fungerade för mig i alla miljöer (webbläsare, Jest, VSCode).
Så här fixade jag det:
import * as ChessJS from "chess.js";
const Chess = typeof ChessJS === "function" ? ChessJS : ChessJS.Chess;
const chess = new Chess();
