You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为可迭代与异步可迭代对象添加Flow类型标注?

好的,我来帮你搞定这两个Flow类型标注的问题~

同步函数foo的Flow类型标注

你的foo函数返回的是一个实现了Symbol.iterator接口的可迭代对象,迭代后会产出number类型的值。Flow提供了内置的Iterable<T>类型来描述这类对象,这是最简洁的标注方式:

const foo: () => Iterable<number> = () => ({ 
  [Symbol.iterator]: function * () { 
    yield * [ 1, 2, 3 ]; 
  }, 
});

如果你想更精确地明确对象的结构(比如指明它必须包含Symbol.iterator属性,且该属性返回一个生成器),可以用Generator<T, R, N>类型来细化:

  • T:生成器产出的值的类型(这里是number)
  • R:生成器最终返回的值的类型(这里没有返回值,所以用void)
  • N:生成器接受的输入值类型(这里不需要输入,所以用void)

对应的标注写法:

const foo: () => { [Symbol.iterator]: () => Generator<number, void, void> } = () => ({ 
  [Symbol.iterator]: function * () { 
    yield * [ 1, 2, 3 ]; 
  }, 
});
异步函数bar的Flow类型标注

异步版本的bar返回的是实现Symbol.asyncIterator接口的异步可迭代对象,Flow同样提供了内置的AsyncIterable<T>类型,用它标注最省心:

const bar: () => AsyncIterable<number> = () => ({ 
  [Symbol.asyncIterator]: async function * () { 
    yield * [ 1, 2, 3 ]; 
  }, 
});

要是你想明确对象的具体结构,可以用AsyncGenerator<T, R, N>类型,参数含义和同步生成器完全一致:

const bar: () => { [Symbol.asyncIterator]: () => AsyncGenerator<number, void, void> } = () => ({ 
  [Symbol.asyncIterator]: async function * () { 
    yield * [ 1, 2, 3 ]; 
  }, 
});

日常开发里,用Iterable<T>和AsyncIterable<T>就足够满足大部分需求了,写法简洁且语义清晰;而详细的结构标注更适合需要严格约束对象形状的场景。

内容的提问来源于stack exchange,提问作者sdgfsdh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 07:26:57