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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 10:24:21