TypeScript基础教程之同步生成器

同步生成器就是普通的 function*,它返回一个 Generator 对象。这个对象既是迭代器,也是可迭代对象。

手工遍历的核心就是反复调用 it.next(),直到 done 为 true。

1. 基本写法

ts 复制代码
function* gen(): Generator<number, void, unknown> {
  yield 1;
  yield 2;
  yield 3;
}

手动遍历:

ts 复制代码
const it = gen();

let result = it.next();

while (!result.done) {
  console.log(result.value); // 1, 2, 3
  result = it.next();
}

console.log(result.done); // true

关键点:

  • function* 调用后不会执行函数体,而是返回生成器对象。
  • it.next() 返回 IteratorResult<T>,同步生成器不需要 await。
  • 每次 next() 执行到下一个 yield。
  • done: false 时,value 是 yield 出来的值。
  • done: true 时,生成器结束。

2. 带 return 返回值

生成器可以通过 return 返回最终值:

ts 复制代码
function* gen(): Generator<number, string, unknown> {
  yield 1;
  yield 2;
  return "结束";
}

const it = gen();

let result = it.next();

while (!result.done) {
  console.log(result.value); // 1, 2
  result = it.next();
}

console.log(result.value); // "结束"
console.log(result.done);  // true

注意:

for...of 遍历时不会拿到 return 的返回值,但手动 next() 可以拿到。

3. 手动传值

可以通过 next(value) 把值传回生成器内部的 yield 表达式:

ts 复制代码
function* dialog(): Generator<string, void, string> {
  const name = yield "请输入姓名:";
  yield `你好,${name}`;
}

const it = dialog();

console.log(it.next());
// { value: "请输入姓名:", done: false }

console.log(it.next("Tom"));
// { value: "你好,Tom", done: false }

console.log(it.next());
// { value: undefined, done: true }

关键点:

  • 第一次 next() 的参数会被忽略。
  • 第二次 next("Tom") 的值会作为上一个 yield 表达式的返回值,赋给 name。

4. 提前终止和清理

生成器内部可以写 try/finally:

ts 复制代码
function* gen(): Generator<number, void, unknown> {
  try {
    yield 1;
    yield 2;
    yield 3;
  } finally {
    console.log("清理资源");
  }
}

const it = gen();

console.log(it.next()); // { value: 1, done: false }
console.log(it.return()); // 触发 finally,输出"清理资源"
// { value: undefined, done: true }

it.return(value) 会提前结束生成器,并执行 finally。

it.throw(error) 可以向生成器内部抛异常。

5. 完整手动遍历模板

ts 复制代码
function* gen(): Generator<number, string, unknown> {
  yield 1;
  yield 2;
  return "done";
}

const it = gen();

let result = it.next();

while (!result.done) {
  const value = result.value; // number
  console.log(value);
  result = it.next();
}

const returnValue = result.value; // string
console.log(returnValue);

总结

同步生成器手工遍历就是:

ts 复制代码
const it = gen();
let result = it.next();

while (!result.done) {
  console.log(result.value);
  result = it.next();
}

不需要 await,因为 next() 直接返回结果,而不是 Promise。

如果需要控制每一步、传值、提前终止或获取 return 值,就用手动 next();如果只是简单消费所有 yield 值,用 for...of 更方便。

相关推荐
缓慢更新7 小时前
AI 辅助生成单测:从接口定义到用例的流水线
java·服务器·前端·网络·数据库·人工智能
陈随易8 小时前
AI 运维服务器,安全又可靠的方法
前端·后端·程序员
风骏时光牛马8 小时前
AI稳定性治理体系构建与疑难问题深度分析
前端
IT_陈寒9 小时前
JavaScript的this坑人实录,这次我真的记下来了
前端·人工智能·后端
开开心心就好10 小时前
音频降噪剪辑工具,音量裁剪一键处理
运维·服务器·前端·spring·ocr·音视频·1024程序员节
螺丝钉tina11 小时前
[Playwright] [02]常用命令与调试:Debug UI、Mode和 Trace Viewer
开发语言·javascript·测试工具·ui·自动化
PedroQue9912 小时前
0.8.2 新增 backFallback 配置,无 tabbar 页返回无忧
前端·uni-app
淡漠的蓝精灵12 小时前
web.py:一个简单到极致的 Python Web 框架
开发语言·前端·python·其他
开开心心就好12 小时前
竖式除法出题工具,整除余数混合模式
运维·服务器·前端·javascript·ocr·perl·1024程序员节
起个名字费劲死了13 小时前
Halcon学习一:骰子识别
前端·python·学习