Как получить доступ к ключу ключа объекта в TypeScript? - PullRequest
0 голосов
/ 13 апреля 2020

Я пытаюсь создать функцию, которая будет иметь доступ к ключу, который находится внутри объекта, который находится внутри другого объекта.

Я читал документацию TS, но я полагаю, что я не использую правильные обобщения в моей функции, например:

interface A {
  abc: number
  acd: number
}
interface B {
  bcd: number
  bde: number
}
interface C {
  cde: number
  cef: number
}
interface Data {
  a: A
  b: B
  c: C
}

const data: Data = {
  a: {
    abc: 1,
    acd: 2
  },
  b: {
    bcd: 3,
    bde: 4
  },
  c: {
    cde: 5,
    cef: 6
  }
}

const getItem = <T extends keyof Data, K extends keyof T>(
    category: T,
    item: K
  ) => {
    console.log(data[category][item]) // ERROR: Type 'K' cannot be used to index type 'Data[T]'.ts(2536)
  }

Спасибо за помощь:)

1 Ответ

2 голосов
/ 13 апреля 2020

Ваша проблема в том, что вы не хотите, чтобы K индексировался в T (который сам по себе является ключевым типом), а в свойство Data в индексе T. Чтобы представить тип свойства с ключом P объекта типа O, вам необходим поисковый (или индексированный доступ) тип с использованием скобочной записи: O[P]. В вашем случае свойство объекта типа Data с индексом типа T имеет тип Data[T]. Так что K должно распространяться не T, а Data[T]:

const getItem = <T extends keyof Data, K extends keyof Data[T]>(
    category: T,
    item: K
) => {
    console.log(data[category][item]);
}

Хорошо, надеюсь, это поможет; удачи!

Детская площадка ссылка на код

...