在泛型约束中使用类型参数

上篇文章中介绍使用extends关键字可以约束传入数据类型必须包含某些属性,或者隶属于某一类。

但是,如果让你约束函数参数中传入对象的参数为指定的一些值,该怎么实现呢?这是什么意思呢,可以看如下的一个示例。

let x = { a: 1, b: 2, c: 3, d: 4 }

getProperty(x, 'a')

function getProperty(obj, key) {
  return obj[key]
}

可以看到,getProperty函数可以传入一个对象obj和对象中的键key,从而获取这个对象中的值。那么,如果要约束传入的第二个参数key必须存在于obj对象中该怎么实现呢?

这里用到了key of关键字,再结合上篇文章中介绍的extends关键字,可以将getProperty改写一下

function getProperty<T, K extends keyof T>(obj: T, key: K): T[K] {
  return obj[key]
}

约束第二参数,使用泛型K,对于任意类型K必须是T中的键,返回值是对象[键]这种形式,也就是T[K]

key of这中形式,就是所谓的索引类型,具体查看官方介绍说明

如果您觉得本文对您有用,欢迎捐赠或留言~
微信支付
支付宝

发表评论

您的电子邮箱地址不会被公开。 必填项已用 * 标注