Переопределение Array.of () в Typescript для пользовательского класса двумерного массива, расширяющего массив - PullRequest
2 голосов
/ 31 мая 2019

Я пытаюсь расширить Array и создать класс Array2D.Я хочу, чтобы конструктор принимал любое количество аргументов, но эти аргументы должны быть массивами типа T. Вот что у меня есть:

class Array2D<T> extends Array<T[]> {
  constructor(...args: T[][]) {
    super(...args)
  }

  static of(...args: T[][]) {
    return new Array2D(...args)
  }
}

Машинопись показывает эту ошибку:

Types of property 'of' are incompatible.
    Type '<T>(...args: T[][]) => Array2D<T>' is not assignable to type '<T>(...items: T[]) => T[]'.
      Types of parameters 'args' and 'items' are incompatible.
        Type 'T' is not assignable to type 'T[]'.

Может кто-нибудь объяснить, на что жалуется Tyspecript и как это исправить.

1 Ответ

2 голосов
/ 31 мая 2019

Вот еще один способ обхода.Давайте расширим тип конструктора Array до чего-то без известных статических методов:

const VanillaArrayConstructor: new <T>(...args: T[]) => Array<T>
    = Array;

Вы можете использовать VanillaArrayConstructor для создания массивов, но компилятор будет жаловаться, если вы попытаетесь вызвать .from()или .of() или любые другие статические методы.И тогда вы можете расширить , что вместо Array:

class Array2D<T> extends VanillaArrayConstructor<T[]> {
    constructor(...args: T[][]) {
        super(...args)
    }

    static of<T>(...args: T[][]) {
        return new Array2D(...args)
    }
}

Это не имеет никакого значения для фактического поведения Array2D во время выполнения, но типизация теперь такова, чтокомпилятор не ожидает, что тип конструктора Array2D расширяет тип конструктора Array.

Надеюсь, это поможет.Удачи!

Ссылка на код

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...