typescript - 在 TypeScript 中获取带有值字符串的枚举键(反向映射)

标签 typescript

我有一个枚举:

export enum ApiMessages {
    logged_ok = 'Logged OK',
    register_ok = 'Register OK'
}

我有一个以枚举作为参数的函数:

export function responseOK(message: ApiMessages, result ?: any): ApiResponse {
    return {
        "status": "ok",
        "code": 200,
        "messageId": ApiMessages[message], <-- KO TS7015
        "message": message,
        "result": result
    };
}

我这样调用函数:

responseOK(ApiMessages.logged_ok, {user: userRes})

我试图将枚举键和枚举字符串值返回给响应,但我收到 TS 错误:

TS7015: Element implicitly has an 'any' type because index expression is not of type 'number'.

我有严格的 TypeScript 配置。添加 suppressImplicitAnyIndexErrors 不是一个选项。

TypeScript 版本:2.9.2

最佳答案

handbook 中所述:

Keep in mind that string enum members do not get a reverse mapping generated at all.

这意味着您的情况没有简单的反向映射。

解决方法:获取字符串枚举成员的反向映射

要通过值获取枚举成员的键,您必须遍历枚举键并将关联值与您的目标值进行比较。

function getEnumKeyByEnumValue(myEnum, enumValue) {
    let keys = Object.keys(myEnum).filter(x => myEnum[x] == enumValue);
    return keys.length > 0 ? keys[0] : null;
}

您可以按如下方式更严格地输入(请注意,我们可以将我们的 enum 解释为可索引类型,此处的键和值都是字符串):

function getEnumKeyByEnumValue<T extends {[index:string]:string}>(myEnum:T, enumValue:string):keyof T|null {
    let keys = Object.keys(myEnum).filter(x => myEnum[x] == enumValue);
    return keys.length > 0 ? keys[0] : null;
}

下面是一些演示代码。您也可以see it in action on the TypeScript Playground

enum ApiMessages {
    logged_ok = 'Logged OK',
    register_ok = 'Register OK'
}

let exampleValue = ApiMessages.logged_ok;
let exampleKey = getEnumKeyByEnumValue(ApiMessages, exampleValue);

alert(`The value '${exampleValue}' has the key '${exampleKey}'`)

function getEnumKeyByEnumValue<T extends {[index:string]:string}>(myEnum:T, enumValue:string):keyof T|null {
    let keys = Object.keys(myEnum).filter(x => myEnum[x] == enumValue);
    return keys.length > 0 ? keys[0] : null;
}

将此添加到您的 responseOK() 中,您最终会得到:

function responseOK(message: ApiMessages, result ?: any) {
    return {
        "status": "ok",
        "code": 200,
        "messageId": getEnumKeyByEnumValue(ApiMessages, message),
        "message": message,
        "result": result
    };
}

关于typescript - 在 TypeScript 中获取带有值字符串的枚举键(反向映射),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54297376/

相关文章:

javascript - Angular 4 数组值丢失

javascript - TypeScript:连接具有不同元素类型的数组

reactjs - 如何让故事书在故事中显示 typescript 类型

javascript - SlickGrid 多级分组与组级选择

angular - typescript :在订阅或 map 中转换类型

reactjs - 使用 SVG 作为 React 组件,并将图像链接作为 prop?

Angular2 w/Typescript - 客户端/服务器应用程序的正确方式?

javascript - TypeScript:仅返回界面的一部分

reactjs - Typescript 无法正确推断 HOC 中的 this.props

angular - 如何添加验证模式不允许输入 Angular2 中只有空格?