Ошибки в классах визуализации в typescript

#javascript #typescript

Вопрос:

У меня есть такой код, что в конце концов все это должно создать фигуры на моей шахматной доске:

 export class Board {
    chessBoard: HTMLCanvasElement;
    ctx: CanvasRenderingContext2D;
    squareSize: number = 80;
    letters: string[] = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'];
    numbers: number[] = [1, 2, 3, 4, 5, 6, 7, 8];
    pieces: IPiece[] = [];
    lightCell: string = '#efd9b7';
    darkCell: string = '#b48866';
    constructor() {
        this.chessBoard = document.getElementById('chessBoard-canvas') as HTMLCanvasElement;
        this.ctx = this.chessBoard.getContext('2d') as CanvasRenderingContext2D;
    }
   ...
  createFigure(row: number, col: number, x: number, y: number): void {
    for (const figure of this.pieces) {
        figure.image.onload = () => row === figure.row amp;amp; col === figure.column ? figure.create(x, y) : null;
    }
    this.createPieces();
  }
}
 

Но у меня есть некоторые проблемы, такие как:
рисунок.изображение.загрузка — Объект, возможно, «не определен». ts(2532)
рисунок.создать(x, y) — Невозможно вызвать объект, который, возможно, «не определен».ts(2722)

Как с этим справиться?

Интерфейс IPiece

 export interface IPiece {
id: number,
column: number,
row: number,
color: TColors,
name: TName,
image?: HTMLImageElement,
steps?: IStep[],
create?(row: number, column: number): void,
newSteps?(row: number, column: number): void,
 

}

Комментарии:

1. показать IPiece интерфейс

2. @andymccullough добавлено выше. Но если удалить ? рядом с изображением и созданием, чем у меня есть ошибки в веб-пакете, такие как: ОШИБКА в C:UsersDENDesktopchesssrcchessGametspiecesBoardPlace.ts ./src/Шахматная игра/ts/piecesBoardPlace.ts 221:4-227:5 [tsl] ОШИБКА в C:UserDesktopchesssrcchessGametspiecesBoardPlace.ts(221,5) TS2739: Тип ‘{ идентификатор: номер; имя: «королева»; цвет: «белый»; строка: номер; столбец: номер; }’ отсутствуют следующие свойства типа ‘IPiece’: изображение, создать

Ответ №1:

учитывая, что image и create являются необязательными, вам нужно будет проверить их существование, например

 for (const figure of this.pieces) {
   if(figure.image) {
      figure.image.onload = () => {
         if(row === figure.row amp;amp; col === figure.column) {
            figure.create?.(x, y)
         }         
      }
   }
}
 

обратите также figure.create?.(x, y) внимание на то, что вызывает только create в том случае, если оно существует

также удален троичный, так как часто считается плохой практикой использовать троичный в качестве короткого способа написания if оператора с вызовом функции

Комментарии:

1. да, это работает, но, к сожалению, я не могу видеть свои цифры в браузере(

2. под «работает» вы подразумеваете, что он просто больше не ошибается, или он действительно звонит create ?

3. да, это может не привести к ошибке, потому что это не вызывающий код, которого не должно быть, но вам нужно будет выяснить, почему эти значения / объекты были не определены в первую очередь

4. где я должен вызвать эту функцию для визуализации моих фрагментов? Создайте фигуру