TypeScript 进阶,深入理解并运用索引访问类型提升代码质量

6ea75b10dab1f5de1bd9c27a91cc815b.jpeg

欢迎回来继续我们的“TypeScript进阶技巧”系列。上次我们深入探讨了如何使用Extract和Exclude实用类型来优化TypeScript的类型处理( 《如何利用 TypeScript 的 Extract 提升类型定义与代码清晰度》和 《如何利用 TypeScript 的 Exclude 提升状态管理与代码健壮性》)。在这篇文章中,我们将探索TypeScript类型系统中的另一个重要概念:索引访问类型(Indexed Access Types)。

在TypeScript中,索引访问类型代表了我们处理类型方式的一大转变。这个特性允许我们在保持TypeScript类型安全的同时,利用JavaScript的动态特性。它使得我们可以像操作值一样查询和操作类型,这在处理复杂数据结构时尤其强大。

基础实例:组件配置对象

我们以一个UI组件的配置对象为例,包含了宽度、高度和颜色等设置。TypeScript使我们能够直接通过键来提取这些属性的类型:

type ComponentConfig = {  width: number;  height: number;  color: string;  
};  type WidthType = ComponentConfig['width']; // number  
type ColorType = ComponentConfig['color']; // string

在这里,WidthType 和 ColorType 分别直接提取了 ComponentConfig 中 width 和 color 的类型。这种能力在创建能够适应 ComponentConfig 任意属性并返回相应类型的函数时非常有用。

动态获取用户属性值

假设我们需要编写一个函数,根据属性名称动态获取用户资料对象的值。用户资料包含了姓名、电子邮件和年龄等属性:

type UserProfile = {  name: string;  email: string;  age: number;  
};  type ProfileProperty = keyof UserProfile;  
type ProfileValue<T extends ProfileProperty> = UserProfile[T];  const userProfile: UserProfile = {  name: 'John Doe',  email: 'jd@example.com',  age: 30  
}  function getProfileValue<T extends ProfileProperty>(prop: T): ProfileValue<T> {  // 获取逻辑  return userProfile[prop];  
}  // 正确用法  
const userName = getProfileValue('name'); // 'John Doe'  // 错误用法  
const userPhoneNumber = getProfileValue('phone'); // TypeScript类型错误:参数“phone”不可赋值给类型“keyof UserProfile”的参数。

通过 keyof 和索引访问类型,getProfileValue 成为一个泛型函数,能够安全地返回 UserProfile 中任何属性的类型。

处理复杂数据结构

这种技术不仅适用于单个属性,还能扩展到数组和其他复杂结构,允许在嵌套对象或数组中提取深层次类型,实现强类型化。

例如,我们正在处理一个公司的组织结构图,这个结构图包括部门,每个部门都有一个员工列表:

type Employee = {  id: number;  name: string;  role: string;  
};  type Department = {  name: string;  manager: Employee;  employees: Employee[];  
};  type Company = {  name: string;  departments: Department[];  
};

假设我们需要处理部门中的员工数组类型,可以直接从 Department 类型中提取:

type EmployeeArrayType = Department['employees']; // Employee[]  function processEmployeeList(employees: EmployeeArrayType) {  employees.forEach(employee => {  console.log(`员工ID: ${employee.id}, 姓名: ${employee.name}, 职位: ${employee.role}`);  });  
}  const someDepartment: Department = {  name: "Development",  manager: { id: 1, name: "Jane Doe", role: "Department Manager" },  employees: [  { id: 2, name: "John Smith", role: "Developer" },  { id: 3, name: "Alice Johnson", role: "Developer" },  ],  
};  // 正确用法
processEmployeeList(someDepartment.employees);  // 错误用法
const incorrectData = { id: 4, name: "Eve Adams", role: "Intern" };  
processEmployeeList(incorrectData); // TypeScript类型错误:类型“{ id: number; name: string; role: string; }”不可赋值给参数类型“Employee[]”。

在这个例子中,EmployeeArrayType 是 Department 中 employees 属性类型的别名,即 Employee[]。这种技术允许我们直接在函数或代码的其他部分使用提取的类型,确保一致性并利用TypeScript的类型检查能力处理复杂的嵌套结构。

索引访问类型不仅是TypeScript的一个特性,更是一种范式。当正确利用时,它能反映JavaScript的动态特性,同时保持TypeScript著名的类型安全性。

结束

在这篇文章中,我们深入探讨了TypeScript中的索引访问类型,这一关键特性极大地增强了我们处理复杂数据结构的能力。无论是简单的配置对象还是复杂的组织结构图,索引访问类型都为我们提供了精准而清晰的类型处理方法。

通过将JavaScript的动态特性与TypeScript的强类型安全性相结合,索引访问类型提供了一种高效处理复杂数据结构的范式。这不仅提高了代码的可靠性,还提升了代码的可读性和可维护性。

在未来的文章中,我们将继续探索TypeScript中更多的高级特性。这些见解将进一步拓展我们在这一强大语言中的理解和能力。

感谢你一直以来的关注和支持!我很期待在接下来的文章中与大家分享更多的知识和技巧。

下次再见 👋!

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

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

相关文章

论文阅读笔记:Cross-Image Relational Knowledge Distillation for Semantic Segmentation

论文阅读笔记&#xff1a;Cross-Image Relational Knowledge Distillation for Semantic Segmentation 1 背景2 创新点3 方法4 模块4.1 预备知识4.2 跨图像关系知识蒸馏4.3 Memory-based像素到像素蒸馏4.4 Memory-based像素到区域蒸馏4.5 整体框架 5 效果 论文&#xff1a;http…

Redis和Docker

Redis 和 Docker 是两种不同的技术&#xff0c;它们各自解决不同的问题&#xff0c;但有时会一起使用以提供更高效和灵活的解决方案。 Redis 是一个开源的内存数据结构存储系统&#xff0c;可以用作数据库、缓存和消息代理。它设计为解决MySQL等关系型数据库在处理大量读写访问…

MySQL数据操作与查询-T5 MySQL函数

一、数学函数和控制流函数 1、数学函数 &#xff08;1&#xff09;abs(x) 计算x的绝对值。 1 select abs(‐5.5),abs(10) &#xff08;2&#xff09;pow(x,y) 计算x的y次方的值。 1 select pow(2,8),pow(8,2) &#xff08;3&#xff09;round(x) 和 round(x,y) 对数字x进…

php遇到的问题

1、 underfined at line 3 in xxx.php , 错误提示&#xff0c;注释这行代码 // error_reporting(DEBUG ? E_ALL : 0); 目录&#xff1a;config/config.php

Ubuntu20.04部署Qwen2.openvino流程

下载代码 里面包含依赖 git clone https://github.com/OpenVINO-dev-contest/Qwen2.openvino.gitpython环境配置 创建虚拟环境 conda create -name qwen2openvino python3.10 conda activate qwen2openvino安装依赖 pip install wheel setuptools pip install -r requirem…

CCAA质量管理【学习笔记】​​ 备考知识点笔记(二)

第三节 GB/T19001-2016 标准正文 本节为ISO9001:2015 标准条款的正文内容&#xff0c;各条款中的术语参照上节内容理解时&#xff0c;会很轻松。本节不再一一对各条款讲解。 引 言 0.1 总 则 采用质量管理体系是组织的一项战略决策&#xff0c;能够帮助其提高整体绩效…

这个网站有点意思,可做SPRINGBOOT的启动图

在 SpringBoot 项目的 resources 目录下新建一个 banner.txt 文本文件&#xff0c;然后将启动 Banner 粘贴到此文本文件中&#xff0c;启动项目&#xff0c;即可在控制台展示对应的内容信息。 下面这个工具很好用&#xff0c;收藏精哦

PFA 反应罐内衬特氟龙 润滑绝缘行业加工 匠心工艺

PFA反应罐别名也叫反应瓶&#xff0c;储样罐&#xff0c;清洗罐等。可作为样品前处理实验中消解样品和中低压溶样的反应容器&#xff0c;广泛应用于半导体分析、新材料、新能源、同位素分析等。 PFA反应罐规格参考&#xff1a;250ml、300ml、350ml、500ml、1L等。 产品特点&…

官网首屏:太漂亮了,真是着了它的魔,上了它的道。

大气的企业官网致力于提供用户友好的界面和优质的用户体验。网页经过精心设计和开发&#xff0c;旨在展示客户的品牌形象和产品信息&#xff0c;并为用户提供便捷的服务和沟通渠道。 官网设计追求简洁、美观、易用的原则&#xff0c;以吸引用户的注意力并提供清晰的导航和信息…

手机丢失不惊慌,华为手机已升级至楼层级设备查找!

出门总是丢三落四&#xff0c;手机丢了怎么办&#xff1f;不要怕&#xff0c;只要你的华为手机升级至云空间新版本&#xff0c;就可以进行楼层级设备查找&#xff0c;现在可以查看到具体的楼层了&#xff01; 之前有手机丢失过的朋友&#xff0c;肯定有相似的经历&#xff0c…

【会议征稿,ACM出版】2024年云计算与大数据国际学术会议(ICCBD 2024,7月26-28)

2024年云计算与大数据国际学术会议(ICCBD 2024)将于2024年7月26-28日在中国大理召开。ICCBD 2024将围绕“云计算与大数据”的最新研究领域, 旨在为从事研究的专家、学者、工程师和技术人员提供一个国际平台&#xff0c;分享科研成果和尖端技术&#xff0c;了解学术发展趋势&…

Windows安装配置CUDA12.5

搞大模型往往都需要GPU加速&#xff0c;本次在家里的PC上安装CUDA来实现GPU加速。 一、环境准备 操作系统&#xff1a;Windows11 23H2 GPU&#xff1a;RTX 4070 Ti Super 显卡驱动&#xff1a;555.99 &#xff08;NVIDIA GeForce 驱动程序 - N 卡驱动 | NVIDIA&#xff09; …

基于JSP技术的定西扶贫惠农推介系统

开头语&#xff1a;你好呀&#xff0c;我是计算机学长猫哥&#xff01;如果有相关需求&#xff0c;文末可以找到我的联系方式。 开发语言&#xff1a;JSP 数据库&#xff1a;MySQL 技术&#xff1a;B/S架构、JSP技术 工具&#xff1a;Eclipse、MySQL、Tomcat 系统展示 首…

【python】OpenCV—Background Estimation(15)

文章目录 中值滤波中值滤波得到图像背景移动侦测 学习来自 OpenCV基础&#xff08;14&#xff09;OpenCV在视频中的简单背景估计 中值滤波 中值滤波是一种非线性平滑技术&#xff0c;主要用于数字信号处理&#xff0c;特别是在图像处理中去除噪声。 一、定义与原理 定义&am…

大模型日报2024-06-14

大模型日报 2024-06-14 大模型资讯 Meta发布Llama 3并专注大规模语言模型研发 摘要: Meta于2024年4月发布了开源的大规模语言模型Llama 3&#xff0c;并详细解释了他们在训练这些模型时关注的重点和方法。Meta目前正专注于大规模语言模型的进一步发展。 微软研究人员推出VALL-E…

log4j漏洞学习

log4j漏洞学习 总结基础知识属性占位符之Interpolator&#xff08;插值器&#xff09;模式布局日志级别 Jndi RCE CVE-2021-44228环境搭建漏洞复现代码分析日志记录/触发点消息格式化 Lookup 处理JNDI 查询触发条件敏感数据带外漏洞修复MessagePatternConverter类JndiManager#l…

论文阅读笔记:DepGraph: Towards Any Structural Pruning

论文阅读笔记&#xff1a;DepGraph: Towards Any Structural Pruning 1 背景2 创新点3 方法4 模块4.1 分组4.2 依赖图4.3 网络分解4.4 依赖建模4.4 组级剪枝 5 效果 论文&#xff1a;https://arxiv.org/pdf/2301.12900 代码&#xff1a;https://github.com/VainF/Torch-Prunin…

LDR6020显示器应用:革新连接体验,引领未来显示技术

一、引言 随着科技的飞速发展&#xff0c;显示器作为信息展示的重要载体&#xff0c;其性能和应用场景不断得到拓展。特别是在办公、娱乐以及物联网等领域&#xff0c;用户对显示器的需求越来越多样化。在这一背景下&#xff0c;LDR6020显示器的出现&#xff0c;以其卓越的性能…

opencv_GUI

图像入门 import numpy as np import cv2 as cv # 用灰度模式加载图像 img cv.imread(C:/Users/HP/Downloads/basketball.png, 0)# 即使图像路径错误&#xff0c;它也不会抛出任何错误&#xff0c;但是打印 img会给你Nonecv.imshow(image, img) cv.waitKey(5000) # 一个键盘绑…

AutoCAD 2025 ObjectARX(C++)二次开发环境搭建

&#xff08;原文&#xff1a;https://blog.iyatt.com/?p16480&#xff09; 基本环境 AutoCAD 机械版 2025 Visual Studio 2022&#xff08;需要安装“C 桌面开发”&#xff09; 开发环境 下载 &#xff08;1&#xff09;ObjectARX SDK 下载&#xff08;提供开发使用的 …