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

TypeScript中如何抽象格式相同的枚举作为组件Props

解决方案

1. 提取公共值类型,定义通用枚举约束

先把两个枚举共有的取值范围提取为统一类型,再基于它定义通用枚举类型,所有结构匹配的枚举都能自动兼容:

// 定义所有枚举允许的取值集合
type EnumAllowedValue = "val1" | "val2" | "val3" | "val4" | "val5";

// 通用枚举类型:键为任意字符串,值必须属于EnumAllowedValue
type GenericValueEnum = Record<string, EnumAllowedValue>;

2. 修改组件Props使用通用类型

把原来的联合类型替换成上面定义的GenericValueEnum,后续新增符合取值要求的枚举时,无需修改Props定义:

interface ComponentProps {
  valueEnums: GenericValueEnum;
}

3. 类型安全地遍历枚举

由于Object.keys()默认返回string[],可以通过类型断言或工具函数实现类型安全的遍历:

方式一:直接类型断言

function MyComponent({ valueEnums }: ComponentProps) {
  // 获取枚举成员名(类型为枚举键的联合类型)
  const enumKeys = Object.keys(valueEnums) as Array<keyof typeof valueEnums>;
  // 获取枚举值(类型为EnumAllowedValue数组)
  const enumValues = Object.values(valueEnums) as EnumAllowedValue[];

  // 遍历示例
  return (
    <div>
      {enumKeys.map(key => (
        <div key={key}>{`${key}: ${valueEnums[key]}`}</div>
      ))}
    </div>
  );
}

方式二:封装工具函数(复用性更好)

// 工具函数:获取枚举的类型安全键数组
function getEnumKeys<T extends GenericValueEnum>(enumObj: T): Array<keyof T> {
  return Object.keys(enumObj) as Array<keyof T>;
}

// 组件内使用
function MyComponent({ valueEnums }: ComponentProps) {
  const enumKeys = getEnumKeys(valueEnums);
  
  return (
    <div>
      {enumKeys.map(key => (
        <div key={key}>{`${key}: ${valueEnums[key]}`}</div>
      ))}
    </div>
  );
}

4. 新增枚举的兼容性

后续新增的枚举只要取值符合EnumAllowedValue,直接传入组件即可,无需修改任何类型定义:

export enum val3 {
  val31 = "val1",
  val32 = "val2",
  val33 = "val3",
  val34 = "val4",
  val35 = "val5"
}

// 直接传入组件,完全兼容
<MyComponent valueEnums={val3} />

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 21:35:13