在 TypeScript 中,迭代器和生成器是用于处理集合和序列的重要工具。它们提供了一种更简洁和可控制的方式来遍历数据结构。以下是 TypeScript 中迭代器和生成器的基本概念和用法:

迭代器(Iterators):

1. 迭代器协议:
   迭代器协议定义了一个对象必须具备的 next 方法,该方法返回一个包含 value 和 done 属性的对象。
   interface Iterator<T> {
       next(): { value: T; done: boolean };
   }

2. 可迭代对象:
   实现了迭代器协议的对象被称为可迭代对象,它们具有一个 Symbol.iterator 方法,返回迭代器对象。
   interface Iterable<T> {
       [Symbol.iterator](): Iterator<T>;
   }

3. 使用 for...of 遍历:
   for...of 循环可以遍历实现了迭代器协议的可迭代对象。
   let numbers = [1, 2, 3];

   for (let num of numbers) {
       console.log(num);
   }

4. 自定义迭代器:
   可以为对象创建自定义迭代器,实现 next 方法即可。
   class MyIterator implements Iterator<number> {
       private data: number[] = [1, 2, 3];
       private index: number = 0;

       next(): { value: number; done: boolean } {
           if (this.index < this.data.length) {
               return { value: this.data[this.index++], done: false };
           } else {
               return { value: 0, done: true };
           }
       }
   }

   let myIterator = new MyIterator();

   for (let num of myIterator) {
       console.log(num);
   }

生成器(Generators):

1. 生成器函数:
   生成器函数是一种特殊类型的函数,使用 function* 关键字声明,返回的是一个生成器对象。
   function* simpleGenerator() {
       yield 1;
       yield 2;
       yield 3;
   }

   let generator = simpleGenerator();

2. 生成器迭代器对象:
   生成器函数返回的对象同时符合迭代器和可迭代对象的协议,具有 next 和 Symbol.iterator 方法。
   interface Generator<T> extends Iterator<T> {
       next(): { value: T; done: boolean };
       [Symbol.iterator](): Generator<T>;
   }

3. 使用生成器:
   使用 next 方法迭代生成器函数的值,每次调用都会执行到下一个 yield。
   console.log(generator.next()); // 输出: { value: 1, done: false }
   console.log(generator.next()); // 输出: { value: 2, done: false }
   console.log(generator.next()); // 输出: { value: 3, done: false }
   console.log(generator.next()); // 输出: { value: undefined, done: true }

4. 生成器的参数和返回值:
   生成器函数可以接受参数,并且可以在 yield 语句中返回值。
   function* generatorWithParams(start: number): Generator<number> {
       for (let i = start; i < start + 3; i++) {
           yield i;
       }
   }

   let generator = generatorWithParams(5);
   console.log(generator.next()); // 输出: { value: 5, done: false }
   console.log(generator.next()); // 输出: { value: 6, done: false }

生成器提供了一种更简单和清晰的方式来定义迭代逻辑,特别是当处理异步代码时。它们可以帮助你更容易地表达和控制迭代流程。


转载请注明出处:http://www.zyzy.cn/article/detail/4704/TypeScript