const createRangeIterable = (from: number, to: number) => {
let currentValue = from
return {
next() {
const value = currentValue < to ? currentValue++ : undefined
const done = value === undefined
return { value, done }
}
}
}
const iterator1 = createRangeIterable(1, 3 + 1)
while(true) {
const { value, done } = iterator1.next()
if(done) break
console.log(value)
}
const range = (from: number, to: number): number[] => from < to ? [from, ...range(from+1, to)] : []
for (const value of range(1, 3 + 1)) {
console.log('range ', value)
}
// 에러 발생 => [Symbol.iterator] 메서드가 없음
const iterable = createRangeIterable(1, 3 + 1)
for (const value of iterable) {
console.log(value)
}
class RangeIterable {
constructor(public from: number, public to: number) {}
[Symbol.iterator]() {
const self = this
let currentValue = self.from
return {
// 메서드로써 동작하므로 this 는 인스턴스를 가리키게 된다.
// 따라서 to가 RangeIterable 를 가리키도록 self 에다가 this 를 담는다
next() {
const value = currentValue < self.to ? currentValue++ : undefined
const done = value === undefined
return {value, done}
}
}
}
}
const iterator2 = new RangeIterable(1, 3 + 1)
for (const value of iterator2) {
console.log('RangeIterable ', value)
}
class 구현 클래스 implements Iterable<생성할 값의 타입> {}
[Symbol.iterator](): Iterator<생성할 값의 타입> {}
ex)
class StringIterable implements Iterable<string> {
constructor(private strings: string[] = [], private currentIndex: number = 0) {
}
[Symbol.iterator](): Iterator<string> {
const self = this;
let currentIndex = self.currentIndex, length = self.strings.length
const iterator: Iterator<string> = {
next(): {value: string, done: boolean} {
const value = currentIndex < length ? self.strings[currentIndex++] : undefined
const done = value === undefined
return { value, done }
}
}
return iterator
}
}
for (const value of new StringIterable(['hello', 'world', '!'])) {
console.log(value)
}
// tsconfig.json
{
"compilerOptions": {
"module": "commonjs",
"target": "es5",
"lib": ["dom", "dom.iterable", "ES2015"],
"esModuleInterop": true,
"moduleResolution": "node",
"sourceMap": true,
"downlevelIteration": true,
},
"exclude": [
"node_modules"
]
}
✅ for...of 구문은 next() 메서드 자동 호출