TypeScript中如何获取未知具体类型的联合枚举项对应字符串值?
解决TypeScript联合枚举类型获取字符串值的问题
嘿,这个问题其实比你想的简单——先直接给你最直观的解决方案:
因为你定义的这些都是字符串枚举,每个枚举成员本身就等于它对应的字符串值,所以你的getEnumValue函数根本不需要额外处理,直接返回参数就行:
enum TextItem { BOOK = "inventory.book", PAGE = "inventory.page" } enum FoodItem { BURGER = "food.burger", LETTUCE = "food.lettuce" } enum DrinkItem { WATER = "drinks.water", COLA = "drinks.cola" } type Item = TextItem | FoodItem | DrinkItem; const getEnumValue = (item: Item): string => { return item; }; // 测试一下,完全没问题 console.log(getEnumValue(DrinkItem.WATER)); // 输出 "drinks.water" console.log(getEnumValue(TextItem.BOOK)); // 输出 "inventory.book"
为什么用keyof Item会得到never类型?
你提到用keyof Item时TypeScript提示never,这是因为Item是三个枚举成员的联合类型,而每个枚举成员本质是字符串字面量类型(比如"inventory.book"、"food.burger")。keyof操作符的作用是获取对象类型的键,但字符串字面量类型本身没有可枚举的键,所以最终得到的就是never类型——这显然不是你想要的方向。
如果你其实是想通过枚举的键名(比如"WATER"、"BOOK")来获取对应的值,那可以这样处理:
方案1:定义所有枚举键的联合类型
先把三个枚举的键合并成一个联合类型,然后依次判断键属于哪个枚举:
// 把三个枚举的键合并成一个类型 type ItemKey = keyof typeof TextItem | keyof typeof FoodItem | keyof typeof DrinkItem; const getEnumValueByKey = (key: ItemKey): string => { if (key in TextItem) { return TextItem[key as keyof typeof TextItem]; } if (key in FoodItem) { return FoodItem[key as keyof typeof FoodItem]; } // 剩下的肯定属于DrinkItem return DrinkItem[key as keyof typeof DrinkItem]; }; // 测试示例 console.log(getEnumValueByKey("WATER")); // 输出 "drinks.water" console.log(getEnumValueByKey("BURGER")); // 输出 "food.burger"
方案2:泛型函数适配任意枚举
如果以后还要加新的枚举,泛型函数会更灵活,不需要每次修改类型:
// 泛型函数,接收枚举对象和对应的键 const getEnumValueGeneric = <T extends Record<string, string>>(enumObj: T, key: keyof T): string => { return enumObj[key]; }; // 用起来很方便 console.log(getEnumValueGeneric(DrinkItem, "WATER")); // "drinks.water" console.log(getEnumValueGeneric(FoodItem, "LETTUCE")); // "food.lettuce"
总结一下
- 如果你的参数已经是枚举成员(比如
DrinkItem.WATER),直接返回它就好,因为字符串枚举的成员本身就是对应的字符串值; - 如果要通过键名获取值,要么提前定义所有键的联合类型,要么用泛型函数来适配不同枚举;
keyof Item得到never是因为Item是字符串字面量的联合,没有可枚举的键,这是TypeScript的类型逻辑导致的。
内容的提问来源于stack exchange,提问作者BobiSad
相关产品推荐
相关产品推荐

