In my problem, I am extracting keys of an enum using Object.keys as follows:
const enum Foo {
FOO = 'foo',
BAR = 'bar'
}
const keys = Object.keys(Foo)
When I then try to use the same keys to point at values from Foo enum, I am getting the following error:
Foo[keys[0]] // Element implicitly has an 'any' type because expression of type 'string' can't be used to index type 'typeof Foo'.
What kind of type should I cast keys to in order for the above to work?
CodePudding user response:
const enum is not compiled to an object. in fact , if you don't use Foo.BAR it is getting erased. Please see TS playground
const enum Foo {
FOO = 'foo',
BAR = 'bar'
}
compiles to "use strict", in other words to empty file.
If you want it to be compiled, please use dot notation:
const enum Foo {
FOO = 'foo',
BAR = 'bar'
}
Foo.BAR
compiles to:
"use strict";
"bar" /* BAR */;
However, if you even get rid of const, you will not get rid of error, because enums are staticaly known values. You are not allowed to use computed keys as a getter.
Hence, you are allowed to use either Foo.BAR or Foo['BAR']
CodePudding user response:
Here is a playground example which casts the Object.keys to the value of the enum keys, and allows indexing access.
If you see the logs you'll see it logs foo and bar.
enum Foo {
FOO = 'foo',
BAR = 'bar'
}
const keys = Object.keys(Foo) as (keyof typeof Foo)[]
keys.forEach((a) => {
console.log(a)
})



