В итоге я решил с типом IfKey <T, K> = [K] extends [keyof T]? Исключить <Обязательно <T [K]>, не определено>: T; а затем возвращаемый тип T6 расширяет Обязательно <infer U>? U: T6
ел бы объявить функцию, которая может принимать объект плюс массив вложенных ключей свойств и получать тип вложенного значения в качестве возвращаемого типа функции.
например
const value = byPath({ state: State, path: ['one', 'two', 'three'] });
// return type == State['one']['two']['three']
const value2 = byPath({ state: State, path: ['one', 'two'] });
// return type == State['one']['two']
Лучшее, что я смог собрать, это следующее, но оно более многословно, чем мне бы хотелось, и мне нужно добавить перегрузку функций для каждого уровня вложенности.
export function byPath<
K1 extends string,
R
>({ state, path }: {
state: {[P1 in K1]?: R},
path: [K1]
}): R;
export function byPath<
K1 extends string,
K2 extends string,
R
>({ state, path }: {
state: {[P1 in K1]?: {[P2 in K2]?: R}},
path: [K1, K2]
}): R;
export function byPath<
K1 extends string,
K2 extends string,
K3 extends string,
R
>({ state, path }: {
state: {[P1 in K1]?: {[P2 in K2]?: {[P3 in K3]?: R}}},
path: [K1, K2, K3]
}): R;
export function byPath<R>({ state, path }: { state: State, path: string[] }): R | undefined {
// do the actual nested property retrieval
}
Есть ли более простой / лучший способ сделать это?