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

在TypeScript中如何将联合类型转换为对应元素的元组类型?

实现方案

TypeScript 联合类型本身是无序集合,我们可以通过分发条件类型、联合转交叉、递归拼接的方式实现指定需求,实现代码如下:

// 辅助泛型:将联合类型转换为交叉类型
type UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends ((k: infer I) => void) ? I : never;

// 辅助泛型:提取联合类型的最后一个成员
type LastOfUnion<U> = UnionToIntersection<U extends any ? () => U : never> extends () => infer R ? R : never;

// 核心Convert泛型:联合类型转固定顺序元组
type Convert<T, U = T> = [T] extends [never] ? [] : [...Convert<Exclude<U, LastOfUnion<U>>>, LastOfUnion<U>];

效果验证

type UnionType = "PK_1" | "PK_2" | "PK_3" | "PK_4";
type ArrayType = Convert<UnionType>; 
// 推导结果为 ["PK_1", "PK_2", "PK_3", "PK_4"],符合预期

注意事项

  • 该实现依赖 TypeScript 内部的联合类型排序逻辑,不同版本的 TypeScript 可能得到不同的元素顺序,如果对顺序有强一致性要求,建议直接显式定义元组,不依赖自动转换。
  • 当联合类型包含非字面量类型(如对象、函数类型)时,需要根据实际场景调整适配逻辑。
  • 联合类型本身自带去重特性,转换后的元组也会自动去重。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 11:33:03