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

能否从对象类型创建联合键值类型?附TypeScript示例需求

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

嗨,这个问题其实用TypeScript的映射类型+索引访问就能轻松搞定!你之前的写法之所以会出现键值不匹配的情况,是因为keyof FooBar和FooBar[keyof FooBar]各自是独立的联合类型,会产生所有可能的组合,而我们需要让每个键和它对应的类型严格绑定。

先明确你的原始类型

type FooBar = { foo: number, bar: string }

解决方案代码

直接定义一个通用工具类型,就能实现你想要的转换:

// 通用工具类型:将对象类型转为键值对联合类型
type KeyValuePair<T> = {
  // 遍历对象的每个键K
  [K in keyof T]: { 
    key: K,          // 键是当前遍历到的K(具体字符串字面量)
    value: T[K]      // 值是K对应的属性类型
  }
}[keyof T]  // 用keyof T索引映射结果,将对象属性转为联合类型

// 测试一下
type Result = KeyValuePair<FooBar>
// Result最终类型:{key: "foo", value: number} | {key: "bar", value: string}

代码逻辑拆解

  1. 映射类型遍历:[K in keyof T]会遍历对象T的每一个键K,为每个键生成一个专属的{key: K, value: T[K]}类型。这一步会得到一个中间对象:
    {
      foo: {key: "foo", value: number},
      bar: {key: "bar", value: string}
    }
    
  2. 转联合类型:用[keyof T]去索引这个中间对象,TypeScript会自动把对象的所有属性值提取出来,组成一个联合类型——这就是我们想要的结果!

更简洁的写法(可选)

如果你喜欢更紧凑的代码,也可以用分布式条件类型实现:

type KeyValuePair<T> = keyof T extends infer K 
  ? K extends keyof T 
    ? { key: K, value: T[K] } 
    : never 
  : never

不过第一种映射类型的写法可读性更强,更推荐日常使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:34:30