如何创建泛型工具类型将联合类型转换为各类型数组的联合?
实现联合类型成员的逐个转换泛型工具类型
当然可以,利用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
相关产品推荐
相关产品推荐

