typescript: make class objects iterable

前端 未结 1 569
故里飘歌
故里飘歌 2020-12-19 17:52

How to make Typescript objects iterable? In Python 3 I can do

class EndlessCounter:
    def __init__(self):
        self.count = 0

    def __iter__(self):
          


        
相关标签:
1条回答
  • 2020-12-19 18:20

    Javascript supports Iterators and generators, typescript doesn't add much to it: typescript Iterators and Generators.

    Your code can be done like this in javascript:

    function* generator() {
        let counter = 0;
        while (true) {
            yield counter++;
        }
    }
    
    var iterator = generator();
    console.log(iterator.next().value); // 0
    console.log(iterator.next().value); // 1
    console.log(iterator.next().value); // 2
    

    Edit

    You can do the same with a class:

    class Counter implements Iterator<number> {
        private counter = 0;
    
        public next(): IteratorResult<number> {
            return {
                done: false,
                value: this.counter++
            }
        }
    }
    
    let c = new Counter();
    console.log(c.next().value); // 0
    console.log(c.next().value); // 1
    console.log(c.next().value); // 2
    

    2nd Edit

    The first solution with the generator works well with the for/of loop:

    function* generator() {
        let counter = 0;
        while (counter < 5) {
            yield counter++;
        }
    }
    for (let i of generator()) console.log(i);
    

    Prints 0 to 5, however, to do that with an instance you'll need to do:

    class Counter implements Iterable<number> {
        private counter = 0;
    
        public [Symbol.iterator]() {
            return {
                next: function() {
                    return {
                        done: this.counter === 5,
                        value: this.counter++
                    }
                }.bind(this)
            }
        }
    }
    let c = new Counter();
    for (let i of c) console.log(i);
    
    0 讨论(0)
提交回复
热议问题