В итоге я решил с типом 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
}

Есть ли более простой / лучший способ сделать это?

Ответы на вопрос(1)

Ваш ответ на вопрос