如何从TypeScript联合类型随机捕获类型并生成全类型数组
TypeScript类型实现方案
1. 实现CatchRandom类型
要从任意联合类型中随机捕获单个成员类型,利用TypeScript分布式条件类型特性即可实现:
type CatchRandom<T> = T extends any ? T : never;
使用示例:
type T = 'a' | 'b' | 'c'; type R = CatchRandom<T>; // R的类型为'a'、'b'、'c'中的某一个
2. 完善Arr类型(联合转数组)
修改原代码中的CatchOne为CatchRandom,并替换未定义的TupleUnion为递归调用Arr本身,实现无需手动指定成员,仅传入联合类型即可生成包含所有成员的数组类型:
type CatchRandom<T> = T extends any ? T : never; type Arr<U extends string, K extends U = CatchRandom<U>, R extends any[] = []> = { [S in U]: Exclude<U, S> extends never ? [...R, S] : Arr<Exclude<U, S>, CatchRandom<Exclude<U, S>>, [...R, S]>; }[K]; // 测试示例 type UUU = Arr<'a' | 'b'>; // 结果为 ['a', 'b'] 或 ['b', 'a'](顺序由类型系统自动决定) type TTT = Arr<'a' | 'b' | 'c'>; // 结果为包含三个成员的任意排列元组
代码说明
CatchRandom<T>:通过分布式条件类型将联合类型拆分为单个成员,让TypeScript自动选择其中一个作为返回结果。Arr类型:- 映射类型
[S in U]遍历联合类型的每一个成员; - 每次递归调用时,用
Exclude<U, S>移除已处理的成员,并将当前成员加入结果数组R; - 当
Exclude<U, S>为空时,递归终止,返回最终的完整数组类型; - 默认参数
K = CatchRandom<U>自动获取联合中的任意成员,无需手动指定即可触发递归遍历所有成员。
- 映射类型
内容的提问来源于stack exchange,提问作者mod7ex
相关产品推荐
相关产品推荐

