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

如何用泛型将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:35:01