使用TypeScript中的值字符串(反向映射)获取枚举键

问题描述 投票:1回答:1

我有一个枚举:

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

我有一个enum作为参数的函数:

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:元素隐式具有“任意”类型,因为索引表达式不是“数字”类型。

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

TypeScript版本:2.9.2

typescript
1个回答
9
投票

handbook所述:

请记住,字符串枚举成员根本不会生成反向映射。

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

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

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

function getEnumKeyByEnumValue(myEnum, enumValue) {
    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(myEnum, enumValue) {
    let keys = Object.keys(ApiMessages).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
    };
}