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.js
chess: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();

Relaterade artiklar