如何推断对象属性的类型

时间:2019-05-15 17:24:49

标签: typescript type-inference

我有以下代码,我想推断对象属性的类型。如您所见,在我的示例中,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: {}

1 个答案:

答案 0 :(得分:1)

当您具有要推断的类型的实际值时,

类型参数推断效果最佳。使用T2作为函数的返回值类型可能会出现问题。除非您在期望的返回值是myValue()类型的上下文中调用C,否则编译器将无法为此推断C。从返回值推断类型参数的过程称为contextual typing,不幸的是,在const v = myValue(...)中,v没有上下文类型。可以是任何东西。

那么您实际上具有哪些类型的值?由于您使用myValue()prop参数调用obj,因此首先要尝试的是给obj一个通用类型,例如T并赋予{{1 }}另一个通用类型,例如prop ....并分别从KT推断Kobj

请注意,您打算将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()

根据需要。

希望有所帮助;祝你好运!