Как вы, вероятно, знаете, итератор - это объект с методом next
, используемый для итерации по итерируемому (объект с методом [Symbol.iterator]
для получения итератора от него).
Array.from
принимает итерируемый (или похожий на массив), но в этом коде он думает, что просто получает итератор .
Большинство итераторов, включая все те, которые вы получаете из стандартных JavaScript методов, также являются итеративными, поскольку они реализуют [Symbol.iterator]() { return this; }
прямо или косвенно через прототип итератора, но не все это делают. Поэтому небезопасно предполагать, что все итераторы являются итеративными.
Возможно, вы захотите обновить routes
, чтобы показать, что он возвращает что-то, что является итератором и итерируемым:
routes(): Iterator<T> & Iterable<T> {
return this._routes.values();
}
Тогда:
const iter = contentMap.routes();
const contentArray = Array.from(iter);
(Нет необходимости в явных типах для них, TypeScript выведет их.)
Вот версия на игровой площадке демонстрация проблемы с использованием Iterator
.
Вот тот же код с использованием Iterator<T> & Iterable<T>
, как указано выше.