TS系列之keyof详解,示例

news2024/11/25 18:52:37

文章目录

  • 前言
  • 一、keyof是什么
  • 总结


前言

如果你用过TS的工具类型,Partial、Required、Pick、Record。那么你可能看过他们内部实现都有共同点就是keyof关键字。即使没有见过,那么下面就一起来了解一下,keyof关键字的详细作用吧。


一、keyof是什么

1、在JavaScript中我们想要获取一个对象的key可以通过Object.keys(obj)来获取

const obj = {
	name: 'test',
	age: 18
}
Object.keys(obj)
//  ['name', 'age']

2、那么在TypeScript中我们呢想要获取一个类型中的所有键,例如:

type ObjType = {
  name: string;
  age: number;
}
type Obj = keyof ObjType
const testObj: Obj = 'name'
const testObj2: Obj = 'age'

那么通过keyof ObjType所获取到的类型就是包含‘name’和’age’联合类型的类型。
那么这有什么用呢,看下面的例子:

在这里插入图片描述
在这里插入图片描述
看到上面你可能觉得这很像是对象中,通过key来获取key所对应属性值的方式。你也可以这么理解,但这是用来获取类型中key所对应的类型。
在这里插入图片描述
一道面试题。用ts定义一个获取对象属性值的方法
基本思路分析:
1、首先传入一个对象,和想要获取值的key
2、如何约束类型
3、直接定义参数类型,尝试一下定义。依然编译错误

function getValue(obj: object, key: string) {
 return obj[key]
}

4、正解:

const obj = {
	name: 'test',
	age: 18
}
function getValue<T extends object, K extends keyof T> (obj: T, key: K) {
  return obj[key]
}

//test
getValue(obj, 'name')
getValue(obj, 'age')
getValue(obj, 'sex')

结果:
在这里插入图片描述
3、其他用法
例如:
基本类型
可以看到的是获取的联合类型是根据基本类型所包含的属性方法的键名。
例如string的:

type T1 = number | typeof Symbol.iterator | “toString” | “charAt” | “charCodeAt” | “concat” | “indexOf” | “lastIndexOf” | “localeCompare” | “match” | “replace” | “search” | “slice” | … 35 more … | “matchAll”

例如any的:

type T1 = string | number | symbol

type T1 = keyof string
type T2 = keyof number
type T3 = keyof boolean
type T4 = keyof any

class Test {
  name: string;
  age: number;
  constructor () {
    this.name = '1'
    this.age = 1
  }
  
}
type classTest = keyof Test

总结

keyof基本功能用法就这些,如果还有其他办法,可以评论区分享学习,如果有错误,欢迎指出。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/647939.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Filebeat详细介绍,下载和启动,日志读取和模块设置等

目录 Filebeat介绍为什么要用Filebeat&#xff1f;架构下载启动读取文件自定义字段输出到ElasticSearch Filebeat工作原理harvesterprospectorinput启动命令参数说明 部署Nginx读取Nginx中的配置文件Modulenginx module 配置配置filebeat测试错误1错误2 Filebeat 介绍 Filebe…

Java开发中的常见问题和解决方法:如何解决常见的性能和bug问题

章节一&#xff1a;引言 在Java开发中&#xff0c;我们经常会面临各种各样的问题&#xff0c;包括性能问题和Bug。这些问题可能会导致应用程序的运行变慢、不稳定甚至崩溃。本文将介绍一些常见的Java开发问题&#xff0c;并提供解决这些问题的方法和技巧&#xff0c;帮助开发人…

ElasticSearch集群8.0版本搭建、故障转移

目录 ElasticSearch集群集群节点搭建集群分片和副本 故障转移将data节点停止将master节点停止 分布式文档路由文档的写操作 搜索文档全文搜索搜索&#xff08;query&#xff09;取回 fetch ElasticSearch集群 集群节点 ELasticsearch的集群是由多个节点组成的&#xff0c;通过…

SSM学习记录9:SpringBoot整合SSM(注解方式)

SSM学习记录9&#xff1a;SpringBoot整合SSM&#xff08;注解方式&#xff09; 1.首先创建新项目&#xff0c;选择Spring Initializr&#xff0c;type为Maven 2.接着依赖选择Spring Web 3.无需繁琐配置&#xff0c;即可运行编写的controller类 启动SpringBootDemoApplication↓…

利用人工智能模型学习Python爬虫

爬虫是一种按照一定的规则&#xff0c;自动地抓取万维网信息的程序或者脚本。 网络爬虫(又称为网页蜘蛛&#xff0c;网络机器人)是其中一种类型。 爬虫可以自动化浏览网络中的信息&#xff0c;当然浏览信息的时候需要按照我们制定的规则进行&#xff0c;这些规则我们称之为网络…

UE4/5样条线学习(一):基础的样条线使用

目录 效果展示&#xff1a; 制作&#xff1a; 组件 逻辑 效果展示&#xff1a; 注&#xff1a;按住alt拉轴可以拉出多一个点 制作&#xff1a; 第一步我们创建一个蓝图&#xff0c;命名为BP_Sline&#xff1a; 组件 之后我们开始找组件&#xff0c;输入bill&#xff0c;我…

使用 docker 创建 mongodb 副本集, 和调整副本集优先级

mongod 本地创建副本集 mongod --port 27017 --dbpath /srv/mongodb/db0 --replSet rs0 --bind_ip localhost,<hostname(s)|ip address(es)> –dbpath 指向数据存放地址 –replSet 后面为 副本集的名。 rs.initiate() 启动新的副本集 rs.conf() 查看副本集的配置 rs.stat…

chatgpt赋能python:Python实现多关键词搜索PDF文件

Python实现多关键词搜索PDF文件 概述 在今天的数字化社会中&#xff0c;很多信息都以数字化的形式存储在PDF文件中。这让我们在搜索特定信息时面临很多挑战&#xff0c;特别是当我们需要同时搜索多个PDF文件并集中检索这些文件时。 在这篇文章中&#xff0c;我们将介绍如何使…

HTTP协议,带你了解HTTP协议

目录 1、HTTP 协议介绍 2、HTTP 协议的工作过程 HTTP 协议的工作过程可以分为以下几个步骤&#xff1a; 3、Fiddler 抓包工具介绍 3.1 抓包工具的使用 3.2 抓包结果 3.3 抓包工具原理 4、HTTP 协议格式总览 5、HTTP 请求&#xff08;Request&#xff09; 5.1 认识 URL…

Seata分布式事务实现

docker方式搭建seata-server(推荐) 参考官方文档: 使用 Docker 部署 Seata Server docker run -d --name seata-server -p 8091:8091 -p 7091:7091 seataio/seata-server:1.6.1 根据版本情况使用不同版本的镜像: https://github.com/alibaba/spring-cloud-alibaba/wiki/%E7…

算法拾遗三十三Morris遍历

算法拾遗三十三Morris遍历 常规二叉树遍历Morris遍历Morris遍历判断是否是搜索二叉树给定一颗二叉树的头节点head&#xff0c;求以head为头的树中&#xff0c;最小深度是多少&#xff1f; 常规二叉树遍历 public static class Node {public int value;Node left;Node right;pub…

UE4/5样条线学习(二):样条网格体组件的使用

目录 效果展示&#xff1a; 制作&#xff1a; 效果展示&#xff1a; 制作&#xff1a; 前面的步骤和之前的UE4/5样条线学习&#xff08;一&#xff09;&#xff1a;基础的样条线使用_多方通行8的博客-CSDN博客是一样的。 创建一个actor蓝图&#xff0c;然后一个公告板组件&…

Redis Lua脚本书写

目录 1. 级联缓存值 1.1 级联缓存session及相关信息 lua脚本语句 redis运行示例 2. 级联查询 2.1 级联查询session lua脚本语句 redis运行示例 3. 级联更新 3.1 级联更新accountId对应的用户信息 lua脚本 redis运行示例 4. 级联续期 4.1 刷新session时级联续期 lu…

嵌入式数据库之sqlite3

一、数据库基本概念 数据&#xff1a;能够输入计算机并能被计算机程序识别和处理的信息集合。 数据库&#xff1a;数据库是在数据库管理系统管理和控制之下&#xff0c;存放在存储介质上的数据集合。 二、常用的数据库 1.大型数据库 Oracle公司是最早开发关系数据库的厂商之一…

架构设计之分析系统性能问题

我们在讨论高性能架构之前&#xff0c;需要先聊聊什么叫高性能&#xff0c;以及如何量化地测试系统的性能。在02 讲中&#xff0c;我们讨论了一些和并发相关的指标。事实上&#xff0c;并发数正是系统性能的核心指标之一&#xff0c;因为高并发会引起系统资源短缺&#xff0c;来…

【夜深人静学数据结构与算法 | 第二篇】后缀(逆波兰)表达式

目录 前言&#xff1a; 中缀表达式&#xff1a; 后缀表达式&#xff1a; 中缀表达式转后缀表达式&#xff1a; 后缀表达式计算结果&#xff1a; 总结&#xff1a; 前言&#xff1a; 计算机在计算四则运算的时候&#xff0c;由于括号以及运算优先级的存在&#xff0c;并不…

大数据Doris(四十一):Routine Load严格模式和导入案例

文章目录 Routine Load严格模式和导入案例 一、严格模式 二、严格模式导入Kafka数据到Doris Routine Load严格模式和导入案例

【Thunder送书 | 第三期 】「Python系列丛书」

文章目录 前言《Python高效编程——基于Rust语言》《Python从入门到精通》《Python Web深度学习》《Python分布式机器学习》文末福利 | 赠书活动 前言 Thunder送书第三期开始啦&#xff01;前面两期都是以【文末送书】的形式开展&#xff0c;本期将赠送Python系列丛书&#xff…

下载安装Visual Studio 2017 Community 来编译NIM_PC_DEMO

1、下载vs2017的引导程序 官方并没有为vs2017提供离线安装包&#xff0c;所以我们选择在线安装。 首先我们下载vs2017的引导程序&#xff1a;Visual Studio 2017安装包 包含如下4个文件&#xff1a; vs_Community.exe&#xff1a; 社区版&#xff0c;免费。但是需要登录微软…

第四节 字符串

文章目录 字符串1.1 字符串介绍1.2 字符串的定义1.3 字符串的输入和输出1.3.1 字符串的索引 1.4 字符串切片1.4.1 切片几种写法 1.5 字符串常用函数1.5.1 find()1.5.2 index()1.5.3 扩展知识: rfind()和rindex()1.5.4 count()1.5.5 replace()1.5.6 split()1.5.7 join() 1.6 字符…