Is it possible to use `keyof` operator on literals instead of interfaces?
I have an object literal such as the following (all properties are known at compile time):
const foo = {
"hello": "hola"
};
If foo
were an interface rather than a variable, I could easily do something like
/** THEORETICAL ONLY - Does not compile! */
function translate(input: keyof foo): string {
return foo[input];
}
However, doing so with a variable does not work, since the compiler cannot find an interface with the name foo
.
Does Typescript support keyof
operations on object literals whose values are known at compile time?
Solution 1:
keyof
operates on types, but foo
is a value. But the typeof
operator takes a value and produces its type, so you can use keyof typeof foo
to do this.
Note that this only works if you haven't associated an interface with the object literal (thanks radicand).
Solution 2:
a bit off, while i'm finding indexer key to literals, but put it here for future reference.
const foo = {
"hello": "hola"
};
let data: { [key in keyof typeof foo]:number} & { name: string, index: number }[] = [] as any;
data.foo = 1;
data[0] = {name:'foo', 1};