Symbol.iterator на TypeScript
Подскажите, пожалуйста, как корректно описать на TypeScript метод next объекта, который возвращается в Symbol.iterator.
За основу своего кода я взял пример описания простого перебираемого объекта на чистом JS из учебника.
interface Range extends Iterable<number> {
from: number;
to: number;
}
const range: Range = {
from: 1,
to: 5,
[Symbol.iterator]() {
interface RangeIterator extends Iterator<number> {
current: number;
last: number;
// next: () => { done: boolean; value?: number; }
// так я написал сначала
next: (...args: [] | [undefined]) => IteratorResult<number, any>;
// так требует указать компилятор TS
}
const rangeIterator: RangeIterator = {
current: this.from,
last: this.to,
// @ts-ignore
// здесь естественно возникает ошибка, т.к. в аргументах next нет никаких ...args: [] | [undefined]
next() {
if (this.current <= this.last) {
return { done: false, value: this.current++ };
} else {
return { done: true };
}
},
}
return rangeIterator;
}
};
Ответы (1 шт):
Автор решения: Evgeny
→ Ссылка
Спасибо @Grundy за то, что помог разобраться. Пока разбирался с этой темой, решил у себя ещё один похожий вопрос. Не знаю, насколько это верное решение, но по крайней мере TS не ругается и не пришлось нигде указывать any.
interface ListIterator<T> extends Iterator<T> {
current: ListNode<T> | null;
next: (...args: [] | [undefined]) => IteratorResult<T, undefined>;
}
[Symbol.iterator](): ListIterator<T> {
const listIterator: ListIterator<T> = {
current: this.#head,
next() {
if (this.current !== null) {
const { value, next } = this.current;
this.current = next;
return { done: false, value: value };
} else {
return { done: true, value: undefined };
}
}
}
return listIterator;
}
Ключевой момент { done: true, value: undefined }.
Пока я не добавил в { done: true } value: undefined, не заработало.