typescript - byt plats på nycklar och värden från en literal rekordtyp


I TypeScript, givet en postliteral, hur byter man nycklarna med värdena?

Det är:

type Foo = { x: "a", y: "b", z: "c" };

Jag önskar kunna skriva type Flip<X> så att:

type Bar = Flip<Foo>; // should be { a: "x", b: "y", c: "z" };

Detta är enbart ett spel med typer - inte med körningens värden.

Svar #1

Detta kan göras genom användning av tangentomkartning.

type Flip<T extends Record<any,any>> = {
     [K in keyof T as T[K]]: K 
}