Создание класса, расширяющего массив - PullRequest
0 голосов
/ 30 апреля 2020

Я ищу способ расширить Array и распределить аргументы конструктора в super.

interface Token {
    name: string
}

class Nodes extends Array {
    constructor (v: Token[]) {
        super(...v)
    }
}

const n = new Nodes([{ name: 'Thomas ' }])

Это вызывает у меня проблемы. Вот ссылка на игровую площадку .

Я тоже попробовал это:

interface Token {
    name: string
}

class Nodes extends Array {
    constructor (v: Token[]) {
        super()
        this.push(...v)
        Object.setPrototypeOf(this, Object.create(Nodes.prototype));
    }
}

const n = new Nodes([{ name: 'Thomas ' }])

console.log(n)

n.map(v => console.log(v.name))

Uncaught TypeError: Найден не вызываемый @@ iterator на новых узлах (eval в (main-3. js: 1239),: 5: 14) в Nodes.map () в eval (eval в (main-3. js: 1239),: 11: 3) в main-3 . js: 1239

Ответы [ 2 ]

0 голосов
/ 30 апреля 2020

Попробуйте это:

interface Token {
  name: string;
}

class Nodes extends Array<Token> {
  constructor (...tokens: Token[]) {
    super();
    this.push(...tokens);
  }
}

const n = new Nodes({ name: 'Thomas ' }, { name: 'Juan' });
console.log(n);
n.map(v => console.log(v.name));

Хорошо работает для меня. :)

0 голосов
/ 30 апреля 2020

Конструктор массива ожидает число в качестве аргумента (длина массива). В вашем случае можно вызвать super() без параметров и просто набрать pu sh позиций позже.

class Nodes extends Array {
    constructor(v: Token[]) {
        super();
        this.push(...v);
    }
}
...