Skip to content
Advertisement

Get TypeScript enum numeric value by member name

I’m converting one of my JavaScript apps to TypeScript and I’ve got a problem: I’ve got a numeric enum, AnswerKeys and a key, "C". I’d like to get the member’s value, "2", so I tried using AnswerKeys[key].

enum AnswerKeys {
  'A' = 0,
  'B',
  'C',
}
let key = 'C'
let answer = AnswerKeys[key]
// it should log 2
console.log(answer)

It would work but I receive the following TypeScript error:

Element implicitly has an ‘any’ type because index expression is not of type ‘number’.

It seems it has a problem with key not being a number. Other answers suggested adding as any assertion or just adding "suppressImplicitAnyIndexErrors": true to the config file, and while these do suppress the error, it’s not what I want.

The following works but accepts any key and I only want to accept strings:

let answer = AnswerKeys[key as any]

I also tried keyOf AnswerKeys but it results in an extra error:

enum AnswerKeys {
  'A' = 0,
  'B',
  'C',
}
let key: keyof AnswerKeys = 'C'
let answer = AnswerKeys[key]
console.log(answer)

Type ‘”C”‘ is not assignable to type ‘”toString” | “toFixed” | “toExponential” | “toPrecision” | “valueOf” | “toLocaleString”‘.(2322)

Is there any way to annotate it correctly?

Advertisement

Answer

To get a union of all of the enum values, you can use keyof typeof Enum. This is because keyof Enum gives you the keys of the object Enum (as AnswerKeys is technically just an object/value), whereas you want the keys of the type Enum.

Using your example, the following runs with no errors:

enum AnswerKeys {
  'A' = 0,
  'B',
  'C',
}
let key: keyof typeof AnswerKeys = 'C'
let answer = AnswerKeys[key]
console.log(answer)
User contributions licensed under: CC BY-SA
3 People found this is helpful
Advertisement