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

如何基于嵌套接口属性动态创建TypeScript联合类型?

动态生成表单值联合类型的TypeScript实现

问题背景

现有TypeScript代码定义如下:

enum FormGroups {
  customer = 'customer',
  address = 'address',
}

interface Customer {
  'firstName': string;
}

interface Address {
  'street': string;
}

interface SomeFormEvent {
  valid: boolean;
  forms: {
    [FormGroups.customer]: {
      values: Customer,
    },
    [FormGroups.address]: {
      values: Address,
    }
  }
}

当前使用静态联合类型 type Forms = Customer | Address,但当SomeFormEvent['forms']中新增表单(如preferences及对应Preferences类型)时,需要手动更新Forms类型。尝试以下写法时报错:

type Forms = { [K in keyof SomeFormEvent['forms']]: SomeFormEvent['forms'][K]['values'] }

需要一种动态方式,让Forms自动包含SomeFormEvent['forms']下所有表单的values类型。

解决方案

你之前的写法是创建了一个映射对象类型,而非联合类型。要生成所有values类型的联合,只需直接提取映射对象的所有值类型即可:

type Forms = SomeFormEvent['forms'][keyof SomeFormEvent['forms']]['values'];

验证示例

如果新增preferences表单及对应类型:

interface Preferences {
  notification: boolean;
}

interface SomeFormEvent {
  valid: boolean;
  forms: {
    [FormGroups.customer]: { values: Customer },
    [FormGroups.address]: { values: Address },
    preferences: { values: Preferences } // 新增表单
  }
}

此时Forms会自动推导为 Customer | Address | Preferences,无需手动修改。

简化写法(可选)

可以先提取forms的类型,让代码结构更清晰:

type FormEntries = SomeFormEvent['forms'];
type Forms = FormEntries[keyof FormEntries]['values'];

内容的提问来源于stack exchange,提问作者Remi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 10:25:16