TypeScript中如何将对象类型转换为name/properties结构联合类型
问题根因
你当前实现的映射类型只会生成和Popups结构一致的普通对象类型,推导结果实际为:
type Something = { createUserDialog: { name: 'createUserDialog', properties: TCreateUserDialogProperties }, updateUserDialog: { name: 'updateUserDialog', properties: TUpdateUserDialogProperties } };
和你需要的联合类型结构不符,核心是缺少了「提取映射对象所有属性值组成联合」的步骤。
正确写法
在你原有映射类型的末尾加上[keyof Popups]索引访问,TS会自动遍历映射对象的所有属性值,将其合并为目标联合类型:
type Something = { [K in keyof Popups]: { name: K, properties: Popups[K] } }[keyof Popups];
推导结果验证
上述写法生成的类型和你预期的结构完全一致:
// 等价于你手动定义的目标类型 type Something = | { name: 'createUserDialog', properties: TCreateUserDialogProperties } | { name: 'updateUserDialog', properties: TUpdateUserDialogProperties };
这是TypeScript中把键值对结构的对象类型,转换为带
name这类判别字段的联合类型的通用实现,后续给Popups新增键时,Something类型会自动同步新增对应的联合项,不需要手动维护。
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

