如何在TypeScript中从对象键值对生成对应类型
如何在TypeScript中基于静态对象生成对应联合类型?
给定如下静态对象:
const map = { 'hello': {a: 1, b: false}, 'world': {b: 'hello', c: null} };
想要生成每个键对应包含type字段的联合类型:
type MapType = { type: 'hello', a: 1, b: false, } | { type: 'world', b: 'hello', c: null, }
你之前的写法会生成所有键与所有值的交叉组合,是因为没有将键和对应的值类型一一绑定。这个需求完全可以实现,具体步骤如下:
步骤1:确保对象类型保留字面量细节
首先给原对象加上as const断言,让TypeScript保留所有值的字面量类型(比如1而不是number,'hello'而不是string):
const map = { 'hello': {a: 1, b: false}, 'world': {b: 'hello', c: null} } as const;
步骤2:用映射类型生成一一对应的联合类型
通过映射类型遍历每个键,将type字段与对应的值类型绑定,最后提取联合类型:
type MapType = { [K in keyof typeof map]: { type: K } & typeof map[K] }[keyof typeof map];
写法解释
[K in keyof typeof map]:遍历map的每个键K{ type: K } & typeof map[K]:为每个键K生成一个对象类型,包含type字段(值为键名)和对应的值类型[keyof typeof map]:访问映射类型的所有属性,最终得到各个键对应类型的联合,而不是交叉组合
此时生成的MapType就是你需要的目标类型。
内容的提问来源于stack exchange,提问作者josno
相关产品推荐
相关产品推荐

