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

如何将TypeScript枚举值转为联合类型用于函数参数

解决方案:将字符串枚举值转为联合类型并优化动物类型匹配

1. 把枚举值转为联合类型

要获取ANIMALS枚举的取值联合类型('cat'|'lion'|'parrot'|'shark'|'snail'),可以使用ANIMALS[keyof typeof ANIMALS],这会自动提取枚举的所有字符串值组成联合类型,直接用在getAnimal的参数上即可。

2. 让animals对象匹配对应动物的接口

创建一个映射类型,将每个枚举值关联到对应的动物接口,替代统一的iBaseAnimal,实现类型精准匹配:

enum ANIMALS {
  CAT = 'cat',
  LION = 'lion',
  PARROT = 'parrot',
  SHARK = 'shark',
  SNAIL = 'snail'
}

interface iBaseAnimal {
  name: string;
  gender: 'male' | 'female';
  wild: boolean;
}

interface iShark extends iBaseAnimal {
  max_gills: number;
}

interface iParrot extends iBaseAnimal {
  wing: { 
    length: 120;
    unit: 'cm';
  };
}

interface iSnail extends Omit<iBaseAnimal, 'gender'> {
  gender: 'hermaphrodite';
}

// 新增:创建枚举值到动物接口的映射
type AnimalMap = {
  [ANIMALS.CAT]: iBaseAnimal;
  [ANIMALS.LION]: iBaseAnimal;
  [ANIMALS.PARROT]: iParrot;
  [ANIMALS.SHARK]: iShark;
  [ANIMALS.SNAIL]: iSnail;
};

interface iAnimals {
  // 使用映射类型,每个键对应正确的动物接口
  animals: AnimalMap;
  // 直接用枚举值联合类型作为参数类型
  getAnimal: (animalKey: ANIMALS[keyof typeof ANIMALS], options: any) => void;
}

额外优化:自动推导枚举值的映射

如果后续枚举扩展,手动维护AnimalMap太麻烦,可以结合keyof自动推导:

// 自动关联枚举键与对应接口
type AnimalMap = {
  [K in keyof typeof ANIMALS]: 
    typeof ANIMALS[K] extends ANIMALS.SHARK ? iShark :
    typeof ANIMALS[K] extends ANIMALS.PARROT ? iParrot :
    typeof ANIMALS[K] extends ANIMALS.SNAIL ? iSnail :
    iBaseAnimal;
};

这样新增枚举值时,只需要补充对应的条件分支即可,无需手动修改映射的键。

内容的提问来源于stack exchange,提问作者Héctor León

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 12:02:43