如何为可迭代与异步可迭代对象添加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
相关产品推荐
相关产品推荐

