如何为TypeScript的chain生成器函数添加混合类型可迭代对象支持?
为可变参数生成器函数添加混合类型支持的类型定义
我编写了如下的chain生成器函数:
function* chain(...iters) { for (let it of iters) yield* it }
该函数接收一组可迭代对象,生成一个按顺序逐个迭代每个输入对象的生成器。我不确定如何为其正确添加类型定义,以支持混合类型的可迭代对象。例如输入为Iterable<X>、Iterable<Y>等时,返回值应为Iterable<X | Y>,请问如何为可变参数实现这种类型定义?
你可以通过泛型可变参数结合条件类型来实现这个需求,以下是具体的类型定义方案:
方案1:直接提取元素类型
function* chain<T extends Iterable<any>[]>(...iters: T): Generator<ReturnType<T[number]['next']>['value']> { for (let it of iters) yield* it }
方案2:自定义元素类型提取工具(更清晰)
先定义一个工具类型来提取可迭代对象的元素类型:
type IterableElement<T> = T extends Iterable<infer U> ? U : never;
再给chain函数添加类型:
function* chain<T extends Iterable<any>[]>(...iters: T): Generator<IterableElement<T[number]>> { for (let it of iters) yield* it }
原理说明
T extends Iterable<any>[]:约束可变参数iters必须是由可迭代对象组成的数组。T[number]:获取数组中所有元素的类型集合(即各个Iterable<X>、Iterable<Y>类型)。IterableElement<T[number]>:通过条件类型infer推断出每个可迭代对象的元素类型,最终合并为所有元素类型的联合类型X | Y | ...。- 返回
Generator类型:生成器函数本身既是Generator也是Iterable,返回该类型能兼容所有Iterable的使用场景。
测试示例
const numIterable = [1, 2, 3]; const strIterable = ['a', 'b', 'c']; const combined = chain(numIterable, strIterable); // combined 的类型为 Generator<string | number, void, unknown> for (const item of combined) { // item 的类型自动推导为 string | number console.log(item); }
内容的提问来源于stack exchange,提问作者gog
相关产品推荐
相关产品推荐

