Для начала, я чувствую, что вы нашли ошибку - пожалуйста, сообщите о ней в сообщениях о машинописи. (см. Комментарий jcalz).
Что касается причин, есть техническое объяснение.
Функция Array
является "особенной" по-разному, и один из них заключается в том, что функция ведет себя одинаково независимо от того, вызываете ли вы ее напрямую или как конструктор ( ссылка ):
Когда Array вызывается как функция, а не как конструктор, он также создает и инициализирует новый объект Array. Таким образом, вызов функции Array (…) эквивалентен выражению создания объекта new Array (…) с теми же аргументами.
Поскольку TypeScript предполагает, что _super.apply(this, arguments)
вернет this
, но вместо этого возвращается новый экземпляр, ваша переменная a
фактически содержит чистый Array
экземпляр, а не ExtArray
.
Кстати, то особое поведение, которое я упомянул о Array
, также верно и для других нативных объектов, например, RegExp
.
Что касается самого Array(...)
, он предназначен для правильной обработки вызова super(...)
, но, поскольку он вызывается косвенно через apply
, он не получает правильный new.target
, и это не работает.
Потенциальным решением этой проблемы может быть вызов super(arguments)
или отображение его с помощью Reflect.construct(this, arguments)
.