Typescript高级: 深入理解in与in keyof

TypeScript & 高级语法 & 详细解释 in、keyof、extends、索引签名、Record、typeof 的含义(不定时更新) 很早就听过 TypeScript,当时自己试了下觉得挺简单的,就是给数据声明一个类型提高可读和维护性,不过当时 TS 还不盛行,项目也没机会用到就一直落着,随着 TS 不断普及,许多项目都开始引入了 TS,这不最近在 github 看到一些 TS 代码后,心里开始吐槽: 这好好的非要给 JS 装饰的这么花里胡哨的?我都认不出来这是什么语言了,你确定这是提升 JS 语言可读性而不是添乱?有同学跟我一样的请举个手!后来静下心来想了想,既来之则安之,与其吐槽,不如静下心来好好重温下 TS ,在这期间也提取了一些有 阅读详情
AI摘要

本文介绍 TypeScript 中 in 和 keyof 的高级用法,包括类型查询、映射类型及其实现轻量级 Map 结构的方法。这些操作符帮助开发者对对象键进行精细化操作。

概述

  • in 和 keyof 是两个非常重要的操作符,它们允许开发者对对象的键(key)进行更精细化的操作和约束
  • in 关键词
    • in关键词则在TypeScript的类型上下文中有特定的用途,它用于映射类型和类型查询
    • 当与keyof一起使用时,in可以遍历一个类型的所有键,并在类型层次上进行操作
    • 比如创建新的类型映射类型、条件判断或是泛型约束
  • keyof 关键词
    • keyof T是一个类型查询操作符,其中T是一个类型
    • 它返回一个联合类型,该联合类型包含了T所有公开属性的键(即属性名)
    • 这在TypeScript中非常重要,因为它允许我们动态地基于一个类型来获取它的属性名集合
    • 从而进行进一步的类型操作
  • 应用场景
    • 动态属性访问:在处理对象时,利用K in keyof T可以确保安全地遍历所有可能的属性,而不会引发运行时错误
    • 类型转换:Readonly类型别名,将所有属性转为只读,是映射类型的一种经典应用
    • API设计:在API设计中,通过K extends keyof约束泛型参数,可以精确地指定参数必须是对象的某个属性,增强了API的类型安全和易用性
    • 配置管理:动态配置对象时,利用映射类型和条件类型可以方便地实现配置项的默认值设定、类型转换等,保持代码的灵活性和可维护性

in 操作符

  • 在 TypeScript 中,in 操作符主要在类型守卫(type guard)和映射类型(mapped type)的上下文中使用

1 ) 类型守卫中的 in

  • 在类型守卫中,in 用于检查一个对象是否具有特定的属性
  • 这有助于在运行时确定对象的形状,并据此进行条件处理

示例

function processObject(obj: any) {
   
     
    if ('name' in obj && 'age' in obj) {
   
     
        console.log(`Name: ${
     
     obj.name}, Age: ${
     
     obj.age}`);  
    } else {
   
     
        console.log('Object does not have name and age properties.');  
    }  
}
  • 在这个例子中,我们使用 in 操作符来检查 obj 是否具有 name 和 age 属性

2 )映射类型中的 in

  • 在映射类型中,in 用于遍历一个类型的所有属性键,并对每个属性进行转换
  • 这允许开发者创建一个新的类型,该类型基于现有类型的每个属性进行某种变换
  • 例如,我们可以定义一个映射类型,将 Person 类型的所有属性都变为可选:

示例

type PartialPerson = {
   
    [K in keyof Person]?: Person[K] };
  • 在这个例子中,PartialPerson 类型将 Person 类型的所有属性都标记为可选
  • 这是通过使用映射类型并结合 keyof 和 in 操作符来实现的
  • 对于 Person 类型的每一个键 K,我们都定义了一个新的可选属性
  • 其类型与原始 Person 类型中对应属性的类型相同

keyof 操作符

  • keyof 操作符用于获取对象类型的所有键(key)的联合类型(union type)
  • 这意味着,如果你有一个对象类型
  • 你可以使用 keyof 来得到一个包含该对象所有键名称的字符串字面量类型的联合

示例

type Person = {
   
     
    name: string;  
    age: number;  
    address: {
   
     
        city: string;  
        state: 
ts中的联合类型和类型保护--- as、in、typeof、instanceof、enum、keyof ts中的联合类型和类型保护--- as、in、typeof、instanceof。enum 阅读详情

相关推荐

深入理解 TypeScript 中的 keyof 和 typeof 操作符

TypeScript 作为 JavaScript 的超集,通过静态类型检查极大地提升了代码的可维护性和开发体验。在 TypeScript 的类型系统中,keyof 和 typeof 是两个极其强大的操作符,它们可以帮助开发者更灵活地操作类型,减少重复代码,并增强类型安全性。本文将深入探讨这两个操作符的用途、区别以及实际应用场景,帮助你更好地掌握 TypeScript 的类型魔法。

vvilkin的学习备忘 2197

Typescript高级: 深入理解Partial类型和Required类型

在 TypeScript 中,Partial 是一个非常实用的内置类型工具它允许我们轻松地将某个类型的所有属性变为可选的这对于处理可能缺少某些属性的对象时特别有用然而,Partial 背后的概念和它在实际开发中的应用场景远比表面看起来要丰富Partial 是 TypeScript 中一个非常实用的类型工具,它允许我们轻松地将类型的所有属性变为可选的通过深入理解 Partial 的原理和使用场景,我们可以更有效地利用它来提高代码的可读性和可维护性。

Wang的专栏 3396

深入理解TypeScript条件类型:从基础到高级应用

TypeScript作为JavaScript的超集,其强大的类型系统为大型应用开发提供了坚实的保障。在TypeScript的高级类型特性中,**条件类型(Conditional Types)**无疑是最强大且实用的特性之一。本文将全面剖析条件类型的概念、语法、工作机制及其在实际开发中的应用场景,帮助开发者掌握这一重要特性。

vvilkin的学习备忘 1528

TypeScript体操,手动实现一些TS语法

TypeScript是JavaScript的超集,TypeScript 通过对原生 JavaScript 提供强类型加持,在很大程度上提升了代码质量。但我在刚开始使用TS的时候,真的太难受了。曾经的我爱上前端就是因为前端开发起来方便快捷,JS的类型可以随心所欲,HTML写完立马就能看到效果。而现在,来了TS,边写边学,边学边写,工作量几近与翻倍。但是!0.更好友好的开发体验,提示更友好1.TS声明即文档,减少了查文档的时间2.复杂的大型项目,能够保证数据结构层级不错位。

梅花寺 1413

深入理解TypeScript映射类型(Mapped Types):原理与应用实践

TypeScript作为JavaScript的超集,其强大的类型系统为前端开发带来了前所未有的类型安全保障。在TypeScript众多高级类型特性中,映射类型(Mapped Types)无疑是最强大且实用的特性之一。本文将全面剖析映射类型的核心概念、实现原理、内置类型解析以及实际应用场景,帮助开发者掌握这一重要特性。

vvilkin的学习备忘 1264

TypeScript 泛型(Generics)全面指南:从基础到高级应用

泛型是编程语言中的一种特性,它允许我们在定义函数、接口或类时不预先指定具体类型,而是在使用时再指定类型。这种机制为我们提供了代码重用和类型安全的双重好处。

vvilkin的学习备忘 1174

TypeScript核心知识点与面试题解析

TypeScript作为JavaScript的超集,通过静态类型系统显著提升了代码质量和开发效率。其核心原理包括基础类型系统、类型推断与高级类型特性,如泛型编程和工具类型等。这些特性在大型企业级项目中尤为重要,能够帮助开发者构建更健壮的应用。TypeScript的类型系统不仅支持基本类型检查,还提供了接口、类型别名等复杂类型定义方式,以及条件类型、映射类型等高级功能。在实际工程实践中,合理使用类型守卫、避免any类型泛滥等最佳实践,能够充分发挥TypeScript的技术价值。本文整理的面试题集萃覆盖了从基础

weixin_30580341的博客 404

【TypeScript入坑】TypeScript 的复杂类型「Interface 接口、class类、Enum枚举、Generics泛型、类型断言」

【TypeScript入坑】TypeScript 的复杂类型「Interface 接口、class类、Enum枚举、Generics泛型、类型断言、namespace」

XH_jing的博客 2321

前端面试题--TypeScript

前端面试题--TypeScript

weixin_57399180的博客 775

一文读懂 TypeScript 中的范型是如何计算的

本文首发于个人博客首先, 我们来写一个函数: loggerNum 函数, 这个函数的作用是 console.log 输入数字值, 然后将该值返回: 假如说我们还需要打印字符串呢? 假如说我们还有布尔类型, 害, 是不是得继续声明一个函数来实现, 算了, 我使用 any: 这种方式当然没有问题, 但是它失去了原有的类型以及类型检查(不到万不得已, 请不要使用 any), 所以我们需要一种捕捉参数类型的方式, 以便我们可以使用它来表示返回的内容. 我们现在给函数添加来一个类型变量, 然后可以捕获到提供的类型(比

wumu0927的博客 522

深入理解 TypeScript 中的 in 操作符

在上面的代码中,我们定义了一个 Car 接口,它包含了 brand 和 color 两个属性,其中 color 属性是可选的。然后我们定义了一个名为 printCarInfo 的函数,它接受一个 Car 类型的参数 car,并根据 car 对象中是否存在 color 属性来输出相应的信息。通过这个示例,我们可以看到,in 操作符与类型保护结合使用,可以帮助我们根据对象的属性来进行类型推断和类型判断,从而更安全地编写代码。我们可以看到,当属性存在于对象中时,in 操作符返回 true,否则返回 false。

loop_git667的博客 706

深入理解TypeScript中的协变与逆变

本文探讨了TypeScript中协变与逆变的概念及其实际应用。协变允许子类型被视为父类型,而逆变则相反。通过Redux Toolkit中的Selector类型问题示例,文章展示了如何解决类型推断导致IntelliSense失效的问题。解决方案是改进SelectorsConstraintMap定义,使其既能保持映射类型又能提供精确类型推断。这体现了理解类型关系对编写安全高效代码的重要性,能有效提升开发体验。

m0_74337424的博客 154

深入理解TypeScript中的类型映射与可选属性

摘要:本文介绍了如何在TypeScript中利用类型映射保留对象属性的可选性,同时为其添加时间戳。通过定义Timestamped<T>和ObjectWithTimestampedProperties<T>等类型,解决了空对象初始化及属性可选性问题。展示了从键数组到对象的转换方法和load函数的类型调整,最后通过测试验证了类型推断的正确性。这种类型映射技巧有助于处理复杂对象结构,提升代码的可读性和维护性。

2501_90323865的博客 61

Android Profiler实战:如何用CPU分析工具揪出卡顿元凶(附线程状态解读)

本文深入解析Android Profiler中的CPU分析工具,重点聚焦线程活动监控。通过解读线程状态时间轴上的绿、黄、灰三色含义,并结合实战案例,指导开发者精准定位导致界面卡顿的CPU密集型或I/O阻塞代码,有效提升应用性能与用户体验。

weixin_29197699的博客 374

Android perfetto 简介

android linux 性能优化 原理及操作

求变,从思想开始 3481

LightTools 中LCD投影仿真的checkerboard pattern偏振控制技术解析

本文深入解析了在LightTools软件中进行LCD投影仿真时,利用checkerboard pattern(棋盘格图案)结合偏振控制技术来模拟液晶面板像素开关、提升图像对比度的核心方法。文章从实战角度出发,详细拆解了通过设置波片(如1/2波片)和偏振片来操控S光与P光转换的原理,并分享了在LightTools中搭建仿真模型、使用VBA脚本自动化配置参数以提高效率的实用技巧,为光学工程师优化投影系统仿真流程提供了清晰指导。

weixin_29305313的博客 345

springcloud+nacos+gateway+oauth2小聚会

在微服务工程中,Nacos作为目前主流的注册中心和配置中心,Spring Cloud Gateway作为目前主流的网关,下面引入spring security+oauth2+jwt作为认证和授权中心,进行简单的聊聊。

ldcaws的专栏 2647

妙算(manifold-2G)通过网线连接笔记本实现静态ip上网

本质就是共享笔记本wifi,配置以太网静态ip,然后在工控机上连接

slender_1031的博客 904

建立时间与保持时间

建立时间与保持时间的计算 文章目录1、建立时间与保持时间概述及模型2、寄存器之间数据传输时建立时间与保持时间3、寄存器之间数据传输时建立时间余量与保持时间余量计算4、 FPGA允许的最大时钟频率或最小时钟周期5、计算FPGA时钟所允许的最大频率或最小时钟周期6、违反建立和保持时间会发生什么? 1、建立时间与保持时间概述及模型 建立时间(Tsu): 在时钟采样之前,输入必须稳定一段时间,该时间量称为建立时间。 理想最优建立时间: 保持时间(Th): 在时钟沿之后输入到触发器稳定所需的最短时间。 理想最优

Crazzy_M的博客 3万+

Transformer 面试题及详细答案120道(1-10)-- 基础概念

本文总结了Transformer模型的10个常见面试问题及答案,涵盖了其核心结构、创新点、工作机制等关键知识点。主要内容包括:Transformer的自注意力机制和多头注意力机制创新点,相比RNN/CNN的优势,模型在《Attention Is All You Need》论文中的提出背景,以及Encoder-Decoder协同工作流程等。重点解析了位置编码的作用、长距离依赖处理能力、与传统注意力机制的区别等核心问题。每个问题都给出了简明扼要的专业解答,适合作为Transformer相关面试准备的参考资料。

大剑师兰特的GIS世界 849

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

上一篇: Typescript高级: 深入理解extends keyof语法
下一篇: Typescript高级: 深入实践Record类型
Wang's Blog
博客等级 码龄12年 7433粉丝 2421原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wang's Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值