如何访问TypeScript中对象的键?

如何访问TypeScript中对象的键?,typescript,typescript-generics,Typescript,Typescript Generics,我试图创建一个函数,该函数可以访问位于另一个对象内部的对象内部的密钥 我一直在阅读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 da

我试图创建一个函数,该函数可以访问位于另一个对象内部的对象内部的密钥

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

接口A{
abc:号码
acd:编号
}
接口B{
密件抄送:号码
bde:编号
}
接口C{
cde:编号
cef:编号
}
接口数据{
a:a
b:b
c:c
}
常量数据:数据={
a:{
abc:1,
acd:2
},
b:{
bcd:3,
bde:4
},
c:{
cde:5,
基金:6
}
}
常量getItem=(
类别:T,
项目:K
) => {
console.log(data[category][item])//错误:类型“K”不能用于索引类型“data[T]”。ts(2536)
}

感谢您的帮助:)

您的问题是您不希望
K
索引到
t
(它本身就是一个键类型),而是索引到
t
处的
数据的属性中。要用
O
类型的对象的键
P
表示属性的类型,需要使用括号表示法:
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]);
}
const getItem=(
类别:T,
项目:K
) => {
console.log(数据[类别][项目]);
}
好吧,希望这会有帮助;祝你好运


您的问题是您不希望
K
索引到
t
(它本身是一个键类型),而是索引到
t
处的
数据的属性中。要用
O
类型的对象的键
P
表示属性的类型,需要使用括号表示法:
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]);
}
const getItem=(
类别:T,
项目:K
) => {
console.log(数据[类别][项目]);
}
好吧,希望这会有帮助;祝你好运


谢谢@jcalz这是绝对正确的,我以前看不到它,但它非常有意义!干杯:)谢谢@jcalz这是绝对正确的,我以前看不到它,但它非常有意义!干杯:)