Это очень сложно (я имею в виду очень ручной) в TypeScript:
// Unfortunately you will need to write a lot of manual function overloads
function getValue<S, P1 extends keyof S>(state: S, path: [P1]): S[P1];
function getValue<S, P1 extends keyof S, P2 extends keyof S[P1]>(state: S, path: [P1, P2]): S[P1][P2];
function getValue<S, P1 extends keyof S, P2 extends keyof S[P1], P3 extends keyof S[P1][P2]>(
state: S,
path: [P1, P2, P3],
): S[P1][P2][P3];
function getValue<S>(state: S, path: (keyof S)[]) {
// You can also use your reduce solution, this is faster since it does not involve a function call
let current: any = state;
for (let i = 0; i < path.length; i++) current = current[path[i]];
return current;
}
В основном вы объявляете столько перегрузок функций, сколько уровней имеется в вашем состоянии. То, что вы получаете взамен, довольно приятно, посмотрите эту игровую площадку TypeScript с кодом и примерами!