能否从对象类型创建联合键值类型?附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}
代码逻辑拆解
- 映射类型遍历:
[K in keyof T]会遍历对象T的每一个键K,为每个键生成一个专属的{key: K, value: T[K]}类型。这一步会得到一个中间对象:{ foo: {key: "foo", value: number}, bar: {key: "bar", value: string} } - 转联合类型:用
[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
相关产品推荐
相关产品推荐

