An object can work with for...of when it provides an iterator.

Custom Iterable Objects

custom.ts
class NumberRange implements Iterable<number> {
    start: number;
    end: number;

    constructor(start: number, end: number) {
        this.start = start;
        this.end = end;
    }

    [Symbol.iterator](): Iterator<number> {
        let current: number = this.start;
        const last: number = this.end;
        return {
            next(): IteratorResult<number> {
                if (current <= last) {
                    const value: number = current;
                    current = current + 1;
                    return { value: value, done: false };
                }
                return { value: 0, done: true };
            },
        };
    }
}

const endValue: number = ;
const range: NumberRange = new NumberRange(1, endValue);
const visited: number[] = [];

for (const value of range) {
    visited.push(value);
}

console.log(visited.join("-"));
class NumberRange implements Iterable<number> {
    start: number;
    end: number;

    constructor(start: number, end: number) {
        this.start = start;
        this.end = end;
    }

    [Symbol.iterator](): Iterator<number> {
        let current: number = this.start;
        const last: number = this.end;
        return {
            next(): IteratorResult<number> {
                if (current <= last) {
                    const value: number = current;
                    current = current + 1;
                    return { value: value, done: false };
                }
                return { value: 0, done: true };
            },
        };
    }
}

const endValue: number = ;
const range: NumberRange = new NumberRange(1, endValue);
const visited: number[] = [];

for (const value of range) {
    visited.push(value);
}

console.log(visited.join("-"));
class NumberRange implements Iterable<number> {
    start: number;
    end: number;

    constructor(start: number, end: number) {
        this.start = start;
        this.end = end;
    }

    [Symbol.iterator](): Iterator<number> {
        let current: number = this.start;
        const last: number = this.end;
        return {
            next(): IteratorResult<number> {
                if (current <= last) {
                    const value: number = current;
                    current = current + 1;
                    return { value: value, done: false };
                }
                return { value: 0, done: true };
            },
        };
    }
}

const endValue: number = ;
const range: NumberRange = new NumberRange(1, endValue);
const visited: number[] = [];

for (const value of range) {
    visited.push(value);
}

console.log(visited.join("-"));
custom iterable A custom iterable implements `Symbol.iterator` and returns an iterator with a `next` method.