在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
相关产品推荐
相关产品推荐

