TypeScript: Reverse map key-value type to value-key

Viewed 1690

Given an object of type:

type Key2Value = {
  foo: "bar"
  voo: "doo"
}

Provided that the values of this type are always string type, how to construct a utility type ReverseMap<T> that reverse maps the key-value pairs to value-key pairs?

type Value2Key = ReverseMap<Key2Value>
// yields:
type Value2Key = {
  bar: "foo"
  doo: "voo"
}
1 Answers
type Key2Value = {
  foo: "bar"
  voo: "doo"
}

type ReverseMap<T extends Record<keyof T, keyof any>> = {
    [P in T[keyof T]]: {
        [K in keyof T]: T[K] extends P ? K : never
    }[keyof T]
}

type Value2Key = ReverseMap<Key2Value>

Playground

Related