TypeScript枚举问题:从值取键及赋值类型不匹配求解
TypeScript 问题解答
问题1:从枚举值获取枚举键
数字枚举(带反向映射)
TypeScript 的数字枚举会自动生成反向映射,直接通过枚举值即可获取对应的键:
enum Screens { Home, About } // 从值获取键 const homeKey = Screens[Screens.Home]; // "Home" const aboutKey = Screens[Screens.About]; // "About"
如果需要更通用的类型安全工具函数:
function getEnumKey<T extends Record<string, number>>(enumObj: T, value: T[keyof T]): keyof T | undefined { return enumObj[value] as keyof T; } const key = getEnumKey(Screens, Screens.Home); // 类型为 "Home" | "About" | undefined
字符串枚举(无反向映射)
字符串枚举没有自动反向映射,需要遍历枚举的键来匹配值:
enum StringScreens { Home = "HOME_PAGE", About = "ABOUT_PAGE" } function getStringEnumKey<T extends Record<string, string>>(enumObj: T, value: T[keyof T]): keyof T | undefined { return Object.keys(enumObj).find(key => enumObj[key as keyof T] === value) as keyof T | undefined; } const key = getStringEnumKey(StringScreens, StringScreens.Home); // "Home"
问题2:解决动态赋值的类型错误
你遇到的问题是 TypeScript 无法跟踪 screen 参数与 data 参数的类型关联,导致错误要求 data 满足所有可能类型的交集。使用泛型约束两者的关联关系即可解决:
enum Screens { Home, About } interface HomeData { title: string posts: string[] } interface AboutData { title: string } interface PageData { [Screens.Home]: HomeData [Screens.About]: AboutData } const pageData: PageData = { [Screens.Home]: { title: 'Home', posts: ['intro', 'care'] }, [Screens.About]: { title: 'About' } } // 用泛型 T 约束 screen 为具体的枚举成员 const addData = <T extends Screens>(screen: T, data: PageData[T]) => { pageData[screen] = data; // 类型检查通过 } // 合法调用示例 addData(Screens.Home, { title: 'New Home', posts: ['update'] }); addData(Screens.About, { title: 'New About' }); // 错误调用会被TypeScript拦截(示例) // addData(Screens.Home, { title: 'Wrong' });
通过泛型 T,TypeScript 会捕获 screen 的具体枚举类型,自动推断出 data 必须是 PageData 中对应键的类型,确保赋值操作的类型安全。
内容的提问来源于stack exchange,提问作者Gabriel Lobo
相关产品推荐
相关产品推荐

