As described in the handbook:
Keep in mind that string enum members do not get a reverse mapping generated at all.
That means there is no simple reverse mapping in your case.
Workaround: Getting a reverse mapping for string enum members
To get the key of an enum member by its value, you have to iterate through the enum keys and compare the associated value with your target value.
function getEnumKeyByEnumValue(myEnum, enumValue) {
let keys = Object.keys(myEnum).filter(x => myEnum[x] == enumValue);
return keys.length > 0 ? keys[0] : null;
}
You can type this more strictly as follows (note that we can interpret our enum
as an indexable type with key and value both being strings here):
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;
}
Some demo code follows. You can also 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;
}
Adding this into your responseOK()
you end up with:
function responseOK(message: ApiMessages, result ?: any) {
return {
"status": "ok",
"code": 200,
"messageId": getEnumKeyByEnumValue(ApiMessages, message),
"message": message,
"result": result
};
}
ApiMessages.logged_ok === 'Logged OK'
. in your functionmessage
is the string you want to send as the message.ApiMessages.logged_ok
is the actual value of enum already! – Tadhg McDonald-Jensen