У меня есть объект:
const Actions = {
entityOne: {
doSomething: () => ...,
doSomething2: () => ...
},
entityTwo: {
doSomething3: () => ...,
doSomething4: () => ...
}
}
Я хочу иметь геттер действий, например:
const getAction = (
entity: keyof typeof Actions, // this returns "entityOne" | "entityTwo"
action: ? // but this?
) => Actions[entity][action]
Могу ли я получить тип действия, зависящий от объекта? что я передаю функции getAction?
Используя параметры универсального типа для ограничения параметров функции, вы можете индексировать объект Actions
, чтобы получить желаемый тип возвращаемого значения:
const Actions = {
entityOne: {
doSomething: () => '1',
doSomething2: () => 2,
},
entityTwo: {
doSomething3: () => '3',
doSomething4: () => 4,
},
};
const getAction = <
K0 extends keyof typeof Actions,
K1 extends keyof typeof Actions[K0],
>(entity: K0, action: K1): typeof Actions[K0][K1] => Actions[entity][action];
const result1 = getAction('entityOne', 'doSomething'); // () => string
const result2 = getAction('entityTwo', 'doSomething4'); // () => number
// etc...