Какой хороший способ выразить глубокий доступ к свойствам typescript

#typescript #typescript-generics

#typescript #typescript-generics

Вопрос:

Попытка смоделировать типы для функции:

 function getDeep (object, property) {
  return property.length <= 0 
    ? object 
    : getDeep(object[property[0]], property.slice(1))
}
 

Как что-то сделать с typescript 4.1:

 type DeepProperty<O, P> = P extends []
    ? O
    : P extends [infer F, ...infer R]
    ? F extends keyof O ? DeepProperty<O[F], R> : undefined
    : undefined

function getDeep<O, P extends string[]> (obj: O, prop: P): DeepProperty<O, P> {}
 

но он не может правильно определить типы

 const hello: number = getDeep({ hello: 1 }, ['hello'])
 

Похоже, что он не может 'hello' быть буквальным. это работает, когда я делаю

 const hello: number = getDeep({ hello: 1 }, ['hello'] as ['hello'])
 

Ссылка на игровую площадку

У меня остались следующие вопросы:

  • Что именно здесь происходит?
  • Правильно ли я подхожу к этому?
  • Является ли это жестким ограничением системы типов?
  • Существуют ли какие-либо открытые проблемы с TS или запросы функций, о которых вы знаете, которые пытаются решить / объяснить поведение здесь.

Комментарии:

1. Помогает ли это github.com/microsoft/TypeScript/issues/10693 ? Я думаю, что (упрощенный) вывод заключается в том, что ваш property параметр равен a string[] , и каким-то образом каждый элемент в этом массиве должен зависеть от предыдущего

2. Нет, идея заключается именно в том, чтобы избежать количества перегрузок в этой проблеме.