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

TypeScript中能否将对象类型映射为键值对联合类型?

解决TypeScript对象转键值对联合类型的问题

你需要让每个键与对应的值一一绑定,生成互斥的联合类型,而非让键和值各自成为联合类型后任意组合。

之前的写法不符合预期,是因为keyof Type和Type[keyof Type]是两个独立的联合类型,TypeScript会将它们组合成所有可能的键值搭配,而非一一对应。

正确实现方式是利用对象映射后索引访问的分发特性:

type EntriesOf<Type> = {
  [Key in keyof Type]: { key: Key; value: Type[Key] }
}[keyof Type]

原理说明:

  1. 先通过映射类型[Key in keyof Type],为原类型的每个键Key单独生成{ key: Key; value: Type[Key] }类型,此时得到一个以原类型键为属性、对应键值对类型为属性值的对象。
  2. 再通过[keyof Type]对该对象做索引访问,TypeScript会自动将所有属性的类型合并为联合类型,最终得到每个键与对应值严格绑定的互斥联合类型。

示例验证:

假设定义:

type ValueA = string;
type ValueB = number;
type Foo = {
  a: ValueA;
  b: ValueB;
};

使用EntriesOf<Foo>会得到:

{ key: 'a'; value: string } | { key: 'b'; value: number }

完全符合预期效果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 04:12:14