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

如何创建泛型工具类型将联合类型转换为各类型数组的联合?

实现联合类型成员的逐个转换泛型工具类型

当然可以,利用TypeScript的分布式条件类型就能实现这个需求,它会自动把联合类型的每个成员单独处理,再将结果重新组合成联合类型。

直接定义泛型工具类型:

type DistributeArray<T> = T extends any ? T[] : never;

用你的示例验证:

type A = 'a'
type B = 'b'
type C = 'c'
type D = 'd'

type unionForArr = A | B | C | D

// 得到期望的结果:A[] | B[] | C[] | D[]
type desired = DistributeArray<unionForArr>

// 错误的结果:整个联合类型转为数组,即 (A|B|C|D)[]
type wrong = unionForArr[]

原理说明:

当泛型参数T是联合类型时,TypeScript会自动触发分布式特性——把联合类型的每个成员单独代入T extends any的条件判断,每个成员都会生成对应的T[],最后将所有结果合并成新的联合类型。

这种思路还能扩展到其他转换场景,比如给每个成员包裹Promise:

type DistributePromise<T> = T extends any ? Promise<T> : never;
type PromiseUnion = DistributePromise<unionForArr> // Promise<'a'> | Promise<'b'> | Promise<'c'> | Promise<'d'>

注意:如果不想触发分布式,只需把T用元组包裹,比如[T] extends [any],此时会把整个联合类型当作一个整体处理。

内容的提问来源于stack exchange,提问作者Just_A.Technicality

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 11:03:11