如何将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
相关产品推荐
相关产品推荐

