Как написать интерфейс для вложенного списка? - PullRequest
0 голосов
/ 13 апреля 2019

Я пытаюсь написать интерфейс для матрицы в Typescript, Я не могу найти способ описать тип Array<Array<number>> как интерфейс.

    const matrix:Array<Array<number>> = [
        [0,0,0],
        [1,1,1],
        [0,1,0],
    ]

Вместо этого я хочу что-то вроде

//dosen't work
    interface Imatrix {
    [index:number]:Array<number>
     }

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

function draw(matrix:Imatrix){
     matrix.forEach(()=>{
     //some code
      })
 }
draw(matrix)

когда я делаю это, я получаю сообщение об ошибке. Свойство forEach не существует для типа 'Imatrix' .ts (2339)

1 Ответ

0 голосов
/ 13 апреля 2019

Если вы действительно хотите использовать интерфейс, вы можете сделать это следующим образом:

interface Row<T> extends T[]
{
  [cell: number]: T
}

interface Matrix<T> extends Row<T>[]
{
  [cell: number]: Row<T>
}

(Возможно, вы хотели бы знать, что T[] является синонимом Array<T>.)

Но TypeScript использует структурное сопоставление, поэтому нет никакой разницы между type и interface , это просто разные синтаксисы для одной и той же вещи.Вот, например, почему мы не используем префикс I перед именами интерфейсов.Код, который я написал выше, идентичен следующему:

type Row<T> = T[];
type Matrix<T> = Array<T[]>;

Если вы хотите добавить свои собственные методы к Matrix, правильный способ ООП - создать для него класскоторый содержит вложенный массив как свойство:

type Row = number[];

class Matrix
{
  elements: Array<Row>;

  multiply(B: Matrix)
  {
    /* do something with elements */
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...