#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
параметр равен astring[]
, и каким-то образом каждый элемент в этом массиве должен зависеть от предыдущего2. Нет, идея заключается именно в том, чтобы избежать количества перегрузок в этой проблеме.