typescripttypescript-typings

Types from both keys and values of object in Typescript


I have two sets of string values that I want to map from one to the other as a constant object. I want to generate two types from that mapping: one for keys and one for values.

const KeyToVal = {
    MyKey1: 'myValue1',
    MyKey2: 'myValue2',
};

The keys are easy enough:

type Keys = keyof typeof KeyToVal;

I'm having trouble getting a compile-time type for the values. I thought maybe one of these would work:

type Values = typeof KeyToVal[Keys];
type Values<K> = K extends Keys ? (typeof KeyToVal)[K] : never;
type Prefix<
    K extends Keys = Keys, 
    U extends { [name: string]: K } = { [name: string]: K }
> = {[V in keyof U]: V}[K];

All of these just made Values to be string. I also tried adapting the two answers to How to infer typed mapValues using lookups in typescript?, but either I got my adaptations wrong, or the answers didn't fit my scenario in the first place.


Solution

  • Actually, you should change the KeyToVal to the below declaration:

    const KeyToVal = {
        MyKey1: 'myValue1',
        MyKey2: 'myValue2',
    } as const; // <----- add the <as const> here
    

    Then create the keys types:

    type Keys = keyof typeof KeyToVal;
    

    Now you can create the types of the values:

    type ValuesTypes = typeof KeyToVal[Keys];