网络知识 娱乐 前端Typescript - 如何正确使用keyof操作符?

前端Typescript - 如何正确使用keyof操作符?

{"data":{"title":"前端Typescript - 如何正确使用keyof操作符?","abstract":"根据typescript文档定义,keyof 运算符采用对象类型并生成其键的字符串或数字文字联合类型。简单的例子:上面是最简单的使用方法,使用keyof定义了一个新类型PersonAttr 这个新类型必须是Person的属性名字其中之一。","cover":"https://p3.toutiaoimg.com/origin/tos-cn-i-qvj2lq49k0/db0348d9fc974bb0a3fda94f8fe679ce","articleType":"article","itemId":"7112604142287553028","groupId":"7112604142287553028","groupSource":2,"isOriginal":true,"banComment":false,"publishTime":"2022-06-24 10:32","source":"开发很简单","tag":"technique","mediaSite":null,"pathname":"/article/7112604142287553028/","loginUserInfo":null,"favorite":false,"relation":{"isFollowing":false,"isFollowed":false},"likeData":{"userLikeStatus":0,"count":1},"isSelf":false,"content":"

根据typescript文档定义,keyof 运算符采用对象类型并生成其键的字符串或数字文字联合类型。

前端Typescript - 如何正确使用keyof操作符?

简单的例子:

前端Typescript - 如何正确使用keyof操作符?

上面是最简单的使用方法,使用keyof定义了一个新类型PersonAttr 这个新类型必须是Person的属性名字其中之一。比如 a 的定义就没问题,但 b 的定义就会报错。

keyof和范型

在范型函数中可以使用keyof操作符来限制类型。比如下面这个函数的定义,

前端Typescript - 如何正确使用keyof操作符?

看起来有点复杂,让我们解释一下,

  • 第一个参数T, 就是传入参数的类型,可以是任何类型
  • 第二个参数 K extends keyof T ,其中keyof返回了包含T类型中所有属性名中的联合类型。extends 关键字在这里是用来限制传入类型,而不是继承。
  • 最后返回类型是T [K] 也就是我们的 obj [key]

我们可以实验一下:

前端Typescript - 如何正确使用keyof操作符?

我们先定义了一个Person类型,调用函数时T就是Person,它有两个属性,age, name, 所以第二个参数传入这两个字符串是没有问题的,而传入其他参数就会报错,比如最后一行的other。这就说明,参数已经被 keyof Person限制了,也就是我们上面定义的 K extends keyof T

使用keyof映射其它类型

继续请看例子:

前端Typescript - 如何正确使用keyof操作符?

解释:

我们开始定义了一个PersonAction 的类型,它定义了Person的行为,walk, talk, 他们都是函数,接下来,我们定义了BooleanFieldsProps<T> ,它的意思是,把所有T类型的属性,全部变成Boolean类型,从而产生一个新类型。这就是PersonProps 的定义,可以看到,经过转化后,我们得到了一个含有Person所有属性名,但类型为Boolean的新类型:

前端Typescript - 如何正确使用keyof操作符?

总结:

以上就是keyof最基本的用法,当您在 TypeScript 中与其他工具一起在正确的位置使用它时,您可以构造简洁且受良好约束的类型,以提高代码中的类型安全性。希望大家都可以掌握。

","imageList":["https://p9.toutiaoimg.com/origin/tos-cn-i-qvj2lq49k0/8588d4ca41cc4801bf4fa64882d06e55?from=pc","https://p9.toutiaoimg.com/origin/tos-cn-i-qvj2lq49k0/8082131c7ef045ea9c77107bfc9f53d4?from=pc","https://p9.toutiaoimg.com/origin/tos-cn-i-qvj2lq49k0/92a58137568b488abeb9913f2a25ae51?from=pc","https://p9.toutiaoimg.com/origin/tos-cn-i-qvj2lq49k0/c64e50eeff0747e68765b56d0347406e?from=pc","https://p9.toutiaoimg.com/origin/tos-cn-i-qvj2lq49k0/5c538d33e08c4052b991f8a3cc01581e?from=pc","https://p9.toutiaoimg.com/origin/tos-cn-i-qvj2lq49k0/370774e42a084212a0d2e27fd6aaa29d?from=pc"],"mediaInfo":{"userId":"MS4wLjABAAAAvlQ5nk9SnS_mKSn7ZtvEdD21GQAQoyt1gYGeCF3RQO0","unsafeUserId":"59881475312","name":"开发很简单","avatarUrl":"https://p26.toutiaoimg.com/origin/user-avatar/f3986ebd548ee577c71222ab89e38b29","description":"分享最新最酷的Web开发技术","userVerified":1},"seoTDK":{"title":"前端Typescript - 如何正确使用keyof操作符?-今日头条","description":"根据typescript文档定义,keyof 运算符采用对象类型并生成其键的字符串或数字文字联合类型。简单的例子:上面是最简单的使用方法,使用k","keywords":"TypeScript","publishTimestamp":"1656037969","modifiedTimestamp":"1656049597"},"logId":"202206241409400101351541532686B82D","sylpageConfig":{"card":{"id":""}},"identity":{"web_id":"7111199547455817229","user_is_login":false},"abtestInfo":{"rsp_type":5,"version_name":"4252807,4164637","parameters":{"feat_repost_type":{"new":true},"home_nav_conf":{"dcd_out":1},"local_filter":{"core_filter":{"filter_list":{"ms::TicaiFilter":true}}},"page_upgrade":{"new_profile":true,"video_double_column":true},"sati":{"enable_ad_prime":true,"enable_sorter_optimus":true,"prime_rule_rank_version":"toutiao_web","use_toutiao_web_feed":true,"format_max_consecutive_middle":2,"format_max_consecutive_nogroups":3,"enable_reduce_nogroup":true},"seraph":{"score_rule":{"default":{"replace":{"group_util":"_CTR - 1000*dislike"}},"new_user":{"replace":{"group_util":"_CTR - 1000*dislike"}}}},"sort":{"allowed_ticai":["forum_post","pgc_text","pgc_video"]},"video_detail_page_upgrade":{"new_page":true}},"env_flag":0},"localCityInfo":{"name":"北京","code":"110000","channelId":3202164529},"showResearch":false}}