TypeScript中能否将对象类型映射为键值对联合类型?
解决TypeScript对象转键值对联合类型的问题
你需要让每个键与对应的值一一绑定,生成互斥的联合类型,而非让键和值各自成为联合类型后任意组合。
之前的写法不符合预期,是因为keyof Type和Type[keyof Type]是两个独立的联合类型,TypeScript会将它们组合成所有可能的键值搭配,而非一一对应。
正确实现方式是利用对象映射后索引访问的分发特性:
type EntriesOf<Type> = { [Key in keyof Type]: { key: Key; value: Type[Key] } }[keyof Type]
原理说明:
- 先通过映射类型
[Key in keyof Type],为原类型的每个键Key单独生成{ key: Key; value: Type[Key] }类型,此时得到一个以原类型键为属性、对应键值对类型为属性值的对象。 - 再通过
[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
相关产品推荐
相关产品推荐

