#typescript #vue.js #vue-component #chessboard.js
Вопрос:
Я пытаюсь завернуть chessboardjs
библиотеку в компонент машинописного текста Vue3. chessboardjs
есть файл типизаций, и IntelliSense моего редактора показывает, что он напрямую импортирует типизацию. Библиотека экспортирует функцию ChessBoard()
, которая выглядит как конструктор/фабрика для ChessBoardInstance
; @types/chessboardjs/index.d.ts объявляет ее следующим образом:
export interface ChessBoardFactory {
(containerElOrId: any, config?: BoardConfig): ChessBoardInstance;
(containerElOrId: any, position: string | BoardPositionType): ChessBoardInstance;
fenToObj(fen: string): boolean | BoardPositionType;
objToFen(obj: BoardPositionType): boolean | string;
}
export const ChessBoard: ChessBoardFactory;
(другие объявления опущены).
Мой код компонента (только часть сценария) выглядит следующим образом:
<script lang="ts">
import { ChessBoard, ChessBoardInstance } from "chessboardjs";
import { defineComponent } from "vue";
export default defineComponent({
name: "ChessBoard",
data() {
return new (class {
board: ChessBoardInstance | null = null;
})();
},
mounted() {
this.board = ChessBoard("board", "start");
},
});
</script>
Этот код компилируется, но завершается сбоем во время выполнения на подключенном крюке()
с сообщением
Не пойманный (в обещании) Ошибка типа: Объект(…) не является функцией
Я также попытался использовать this.board = ChessBoard("board", "start");
в mounted()
крючке вместо вышеперечисленного, но это не удалось скомпилировать, с сообщением:
'new' expression, whose target lacks a construct signature, implicitly has an 'any' type VueDX/TS(7009)
Может кто-нибудь, пожалуйста, помочь мне понять, что здесь происходит, и/или предложить лучший подход?
Комментарии:
1. верните новый (класс { — зачем вам это нужно? Я также пробовал использовать this.board = шахматная доска(«доска», «старт»); в смонтированном() крючке вместо вышеуказанного, — вы уже делаете это в приведенном выше коде, пожалуйста, уточните, какая ошибка возникает в каком случае.
2.
return new (class {
Конструкция позволяет мне указать типboard
— я копирую пример, где это было сделано, но, возможно, есть лучший способ?3. @Колба Эстуса … и вторая попытка должна была включать ключевое
new
слово — мой плохой. Таким образом, предложение должно гласитьthis.board = new ChessBoard("board", "start");
, что приводит к указанной ошибке'new' expression...
.4.
board
тип может быть просто указан с помощью утверждения типа, иначе, TS, не требуется писать поддельныйnew class {
код.data
является устаревшим API Vue 2. Придерживайтесьsetup
для нового кода, дружественного к TS. Из того, что я вижу,ChessBoard
предполагается, что он будет использоваться безnew
. npmjs.com/package/chessboardjs является фиктивным пакетом, если вы используете его именно тогда, проблема в том, что вы установили не тот пакет.