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, не заработало.

→ Ссылка