TypeScript - Mappa nyckeltyp med värdetyp i funktionssignatur baserat på ett typobjekt


Föreställ dig att ha en typmappning som denna:

type MyTypeMapping = {
  Key1: Type1;
  Key2: Type2;
};

och en funktion som denna:

const getVal = (key: keyof MyTypeMapping) => {
  return getObjectFromStorage(key)
}

Den förväntade returtypen för funktionen getVal måste följa från det angivna nyckelvärdet. Så om key === Key1 måste den förväntade returtypen vara Type1.

Och för en nära relaterad fråga, föreställ dig om det finns en funktion:

const setVal = (key: keyof MyTypeMapping, val: T) => {
  return setObjectInStorage(key, val)
}

Hur gör du typen av argumentet val beroende av typen av argumentet key? Så om key === Key2, måste den förväntade typen av val vara Type2.

Svar #1

Du kan använda en härledd generell typ för det.

const getVal = <K extends keyof MyTypeMapping>(key: K): MyTypeMapping[K] => {
  return getObjectFromStorage(key) as MyTypeMapping[K];
};

const setVal = <K extends keyof MyTypeMapping>(key: K, val: MyTypeMapping[K]) => {
  return setObjectInStorage(key);
};