I have an object
{
foo: "bar",
a: "b",
roses: "red",
}
I would like to create a template literal which would give me the following possibilities:
"foo=bar" | "a=b" | "roses=red"
So basically, key=value
What I've done so far is:
type Foo = `${keyof typeof obj}=${typeof obj[keyof typeof obj]}`;
But this give me every possible combination:
"foo=bar" | "foo=b" | "foo=red" | "a=bar" | ...
I feel I need to use a generic but I'm not able to make it work
CodePudding user response:
You can use a self-indexing mapped type:
const obj = {
foo: "bar",
a: "b",
roses: "red",
} as const;
type Foo = {
[K in keyof typeof obj]: `${K}=${typeof obj[K]}`
}[keyof typeof obj];
This evaluates to:
type Foo = "foo=bar" | "a=b" | "roses=red"