我有以下代码,我想推断对象属性的类型。如您所见,在我的示例中,v
的推断类型是{}
。
如何编写myValue
,以便在TypeType编译时推断出C
?
const myValue = <T1, T2>(prop: string, obj: T1): T2 => {
return obj[prop]
}
interface C {
readonly c: string
}
interface TestInt {
readonly a: string
readonly b: number
readonly c: C
}
const test: TestInt = {
a: 'a',
b: 1,
c: {
c: 'c',
},
}
const v = myValue('c', test) // const v: {}
答案 0 :(得分:1)
类型参数推断效果最佳。使用T2
作为函数的返回值类型可能会出现问题。除非您在期望的返回值是myValue()
类型的上下文中调用C
,否则编译器将无法为此推断C
。从返回值推断类型参数的过程称为contextual typing,不幸的是,在const v = myValue(...)
中,v
没有上下文类型。可以是任何东西。
那么您实际上具有哪些类型的值?由于您使用myValue()
和prop
参数调用obj
,因此首先要尝试的是给obj
一个通用类型,例如T
并赋予{{1 }}另一个通用类型,例如prop
....并分别从K
和T
推断K
和obj
。
请注意,您打算将prop
作为prop
的键之一,因此您对obj
的类型拥有自然的constraint,即它应该扩展K
。
最后,函数的返回类型可以从其他类型派生。它应该是其键为keyof T
的{{1}}属性的类型。可以表示为T
(一个lookup type)。
以下是该功能的最终版本:
K
请注意该功能与documentation for keyof
and lookup types中提到的T[K]
功能之间的相似性。唯一的区别是参数的顺序(好吧,而且返回类型是推断的,而不是带注释的事实。。。。。。。还有我想的函数名称)。
当我们使用const myValue = <T, K extends keyof T>(prop: K, obj: T): T[K] => {
return obj[prop];
}
的定义时,我们得到:
getProperty()
根据需要。
希望有所帮助;祝你好运!