typescript - 如何推断对象属性的类型
问题描述
我有以下代码,我想推断对象属性的类型。如您所见,v
在我的示例中推断的类型是{}
. 我该如何编写myValue
以便C
在编译时由 Typescript 推断?
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: {}
解决方案
当您拥有要推断的类型的实际值时,类型参数推断效果最佳。拥有T2
函数返回值的类型很可能是个问题。除非您在期望返回值是 typemyValue()
的上下文中调用,否则编译器会推断它的希望很小...从返回值推断类型参数称为上下文类型,不幸的是,在没有上下文类型。它可以是任何东西。 C
C
const v = myValue(...)
v
那么你实际上有哪些类型的值?由于您myValue()
使用prop
和obj
参数调用,因此首先要尝试的是给出obj
一个泛型类型T
,并给出prop
另一个泛型类型,如K
.... 和 inferT
和K
from obj
and prop
。
请注意,您打算 thatprop
应该是 的键之一,因此您对 的类型obj
有一个自然约束K
,即它应该扩展keyof T
。
最后,您的函数的返回类型可以从其他类型派生。它应该是T
其键为的属性的类型K
。这可以表示为T[K]
(查找类型)。
这是函数的最终版本:
const myValue = <T, K extends keyof T>(prop: K, obj: T): T[K] => {
return obj[prop];
}
请注意该函数与文档中getProperty()
提到的函数和查找类型之间的相似性。唯一的区别是参数的顺序(嗯,返回类型是推断而不是注释的事实......以及函数名称,我猜)。keyof
当我们使用 的定义时myValue()
,我们得到:
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: C
如你所愿。
希望有帮助;祝你好运!
推荐阅读
- java - 使用一种方法从文本文件中读取数字并返回素数
- c# - MenuItem 中的单击事件
- c++ - 是`boost::function
f`是指针还是对象? - javascript - 删除列 css 网格中的间隙
- angular - 在 firestore 中更新文档会使结果列表变为初始形式
- next.js - 如何在 chakra ui 中自定义盒子大小?
- wordpress - twitterbot/1.0 导致高 CPU 和 Ra
- scala - libraryDependencies Spark in build.sbt 错误(IntelliJ)
- python - 具有多个模块的 Python 扩展
- javascript - 使用 .add() jQuery 方法将 div 添加到元素