Думаю, проблема в том, что ваш конструктор List
не ожидает те же аргументы, что и конструктор Array
.
Когда встроенные методы, такие как map()
, создают новый массив, они конструируют его, используя конструктор, найденный в static Symbol.species
свойстве класса .По умолчанию это то же самое, что и сам конструктор класса ... если вы не переопределите его.Так что List[Symbol.species]
это List
.И List.prototype.map()
в итоге вызовет new List(...)
.Я почти уверен, что эти методы ожидают, что конструктор в [Symbol.species]
примет те же аргументы, что и конструктор Array
, а именно одну из следующих перегрузок:
new Array(element0, element1[, ...[, elementN]]); // variadic arguments, one per item in array
new Array(arrayLength); // one numeric argument specifying length
Но ваш *Конструктор 1020 * ожидает, что его первый (и единственный) аргумент items
будет повторяться (поскольку он использует распространяемый синтаксис для него в вызове super(...items)
. Когда list.map(x=>x*2)
выполняется, он вызывает что-то вродеnew List(3)
, и вы получаете сообщение о том, что 3
не повторяется.
Итак, что вы можете сделать, чтобы это исправить? Безусловно, самый простой способ - убедиться, что ваш List
Конструктор совместим с типом ArrayConstructor
, так как он принимает те же типы аргументов.
Следующий простой способ - переопределить List[Symbol.species]
и вернуть конструктор Array
:
static get [Symbol.species](): ArrayConstructor {
return Array;
}
Но это будет означать, что list.map(x => x*2)
возвращает Array
, а не List
.
Предполагая, что вам действительно нужен ваш конструктор List
для выполнения одной итерацииаргумент вместо того же самого variadic-или-возможно-может-единственного числааргументы как Array
, и, предполагая, что вам нужно list.map()
, чтобы возвратить List
, вы можете переопределить свойство List[Symbol.species]
чем-то более сложным:
static get [Symbol.species](): ArrayConstructor {
return Object.assign(function (...items: any[]) {
return new List(new Array(...items))
}, List) as any;
}
Это по существу вызывает вызов собственных методовnew List(new Array(x,y,z))
вместо new List(x,y,z)
.
Хорошо, надеюсь, что это имеет смысл и дает вам некоторое направление.Удачи!