如何用泛型将TypeScript辨别联合类型转换为对应对象类型
如何将TypeScript辨别联合类型转换为键值对对象?
没问题,这个需求完全可以实现!你之前的写法问题在于没有针对每个type单独提取对应的values,导致所有类型的values被合并到了每个键下面。我来给你修正一下实现:
// 你的原始辨别联合类型 type Something = { type: 'mode'; values: 'first' | 'second'; } | { type: 'part'; values: 'upper' | 'lower'; }; // 修正后的泛型工具类型 type DiscUnionToObject<U extends { type: string; values: unknown }> = { [V in U['type']]: Extract<U, { type: V }>['values'] }; // 测试结果,完全符合预期 type Result = DiscUnionToObject<Something>; // Result的类型是:{ mode: 'first' | 'second'; part: 'upper' | 'lower'; }
为什么原来的写法不行?
你之前的U['values']会直接提取联合类型中所有成员的values属性,相当于把'first' | 'second'和'upper' | 'lower'合并成了一个大的联合类型,所以每个键都会得到这个合并后的结果。
修正写法的原理
这里核心用到了TypeScript内置的Extract工具类型:
Extract<U, { type: V }>会从联合类型U中筛选出**仅包含type属性等于当前遍历的V**的那个成员- 之后再取这个筛选后的成员的
values,就能精准获取对应type专属的值类型了
这样遍历每个type作为对象的键时,对应的值都是该type独有的values集合,不会出现交叉的情况。
内容的提问来源于stack exchange,提问作者lort
相关产品推荐
相关产品推荐

