copal
@copal
𝄞 ...оооо baby

Как создать типизированный итератор?

Как правильно создавать типизированный итератор?
class Node {
    public id: number;

    constructor(id: number){
        this.id = id;
    }
}

class List {
    public nodeAll: Node[];

    constructor(nodeAll: Node[]){
        this.nodeAll = nodeAll;
    }

    iterator(): Iterator<Node> {
        return this.nodeAll[Symbol.iterator]();
    }
}

let list = new List([new Node(0), new Node(1), new Node(2)]);

let iterator: Iterator<Node> = list.iterator();

for(let node of iterator){
    console.log(node.id);
}


error TS2488: Type must have a '[Symbol.iterator]()' method that returns an iterator.
  • Вопрос задан
  • 2997 просмотров
Решения вопроса 2
Я не уверен, но мне кажется, что typescript ждет интерфейса IterableIterator
interface IterableIterator<T> extends Iterator<T> {
    [Symbol.iterator](): IterableIterator<T>;
}

Попробуйте так
class Node {
    public id: number;

    constructor(id: number){
        this.id = id;
    }
}

class List {
    public nodeAll: Node[];

    constructor(nodeAll: Node[]){
        this.nodeAll = nodeAll;
    }

    iterator(): IterableIterator<Node> {
        return this.nodeAll[Symbol.iterator]();
    }
}

let list = new List([new Node(0), new Node(1), new Node(2)]);

let iterator: IterableIterator<Node> = list.iterator();

for(let node of iterator){
    console.log(node.id);
}
Ответ написан
k12th
@k12th
console.log(`You're pulling my leg, right?`);
error TS2488: Type must have a '[Symbol.iterator]()' method that returns an iterator.

[Symbol.iterator](): IterableIterator<Node> {
    return this.nodeAll[Symbol.iterator]();
}

Имя метода должно быть Symbol.iterator, а не iterator. И да, дженерик IterableIterator, как правильно заметил Алексей Зуев.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы