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

如何从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类型:
    1. 映射类型[S in U]遍历联合类型的每一个成员;
    2. 每次递归调用时,用Exclude<U, S>移除已处理的成员,并将当前成员加入结果数组R;
    3. 当Exclude<U, S>为空时,递归终止,返回最终的完整数组类型;
    4. 默认参数K = CatchRandom<U>自动获取联合中的任意成员,无需手动指定即可触发递归遍历所有成员。

内容的提问来源于stack exchange,提问作者mod7ex

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 00:15:43