我有一个枚举:
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/