如何访问TypeScript中对象的键?
我试图创建一个函数,该函数可以访问位于另一个对象内部的对象内部的密钥 我一直在阅读TS文档,但我认为我没有在函数中使用正确的泛型,例如:如何访问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
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这是绝对正确的,我以前看不到它,但它非常有意义!干杯:)