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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 23:55:43