如何将嵌套联合类型转换为顶层联合类型
如何展开元组内的联合类型到顶层联合?
给定如下TypeScript联合类型:
type someUnionType = [1 | 2 | 3,"Some value"] | [4,"Another value"];
需要将其转换为每个元组内联合成员都展开的顶层联合:
type anotherUnionType = [1,"Some value"] | [2,"Some value"] | [3,"Some value"] | [4,"Another value"];
你的实现问题分析
你尝试的代码逻辑存在错误,导致最终得到never类型:
isAUnionAtTopLevel的判断逻辑偏离需求,U[any]针对元组类型会提取所有元素的联合,无法准确识别元组第一个元素是否为联合类型;convertToFlat中infer out extends value的写法不符合类型推断规则,无法正确提取并展开联合成员。
正确实现方案
利用TypeScript的分布式条件类型可以轻松实现需求,直接遍历联合中的每个元组,展开元组内的联合成员并重组元组:
type someUnionType = [1 | 2 | 3,"Some value"] | [4,"Another value"]; // 展开元组内的联合类型到顶层联合 type FlattenTupleUnion<T> = T extends [infer A, infer B] ? A extends any ? [A, B] : never : never; type anotherUnionType = FlattenTupleUnion<someUnionType>; // 类型结果:[1, "Some value"] | [2, "Some value"] | [3, "Some value"] | [4, "Another value"]
工作原理
T extends [infer A, infer B]:将联合中的每个元组拆解为第一个元素A和第二个元素B;A extends any:触发分布式条件类型,将A中的每个联合成员单独处理;[A, B]:把每个单独的A成员和固定的B重组为新元组;- 所有新元组自动合并为顶层联合,得到最终目标类型。
内容的提问来源于stack exchange,提问作者user25546012
相关产品推荐
相关产品推荐

