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

如何为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 18:05:29