首页 > 解决方案 > 如何在 TypeScript 中访问对象键的键?

问题描述

我正在尝试创建一个函数,该函数可以访问另一个对象内部的对象内部的键。

我一直在阅读 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)
  }

感谢您的帮助 :)

标签: typescripttypescript-generics

解决方案


您的问题是您不想K索引T(它本身就是一个键类型),而是Data索引 at 的属性T。要使用类型对象的键P来表示属性的类型O,您需要使用括号表示法的查找(或索引访问)类型O[P]: 。Data在您的情况下,类型索引处类型对象的属性T具有 type 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]);
}

好的,希望有帮助;祝你好运!

Playground 代码链接


推荐阅读