TypeScript可选属性(Optional Properties)终极指南:用?号解锁对象动态性!!!

🌳 TypeScript可选属性(Optional Properties)终极指南:用?号解锁对象动态性 🚀

「小知识大力量」:在TypeScript中,一个?号就能让你的对象属性从「必须存在」变成「灵活可选」!🎯 本文将用代码示例、流程图和实战场景,带你彻底掌握这一核心特性!


一、🔥 什么是可选属性?(附Mermaid属性结构图)

1.1 核心定义

语法:在属性名后加?(如itemStyle?: {...}
语义:该属性可以存在,也可以不存在于对象中
类型检查:TS会严格验证属性的存在性,避免undefined错误

1.2 Mermaid属性结构图

TreeNode
+name: string
+value: any
+children: any[]
+itemStyle? : ItemStyle
+symbol? : string
ItemStyle
+color: string
+borderColor?: string

📌 关键点
itemStylesymbol?号,表示可选
• 即使itemStyle存在,其内部的borderColor仍是可选的


二、💡 为什么需要可选属性?(附决策流程图)

2.1 典型场景

  1. 条件式属性(如根据node.status动态添加itemStyle
  2. 渐进增强对象(分步构建复杂对象)
  3. API响应兼容(处理可能缺失的字段)

2.2 与JavaScript的对比

特性JavaScriptTypeScript
属性存在性检查❌ 无✅ 严格检查
动态属性✅ 自由增减✅ 受类型约束
代码可维护性⚠️ 容易出错✅ 高

2.3 Mermaid决策流程图

创建TreeNode节点
status === 2?
添加itemStyle和symbol
跳过这些属性
对象包含itemStyle/symbol
对象不包含这些属性

三、🎯 实战解析:邀请码树形图中的可选属性

3.1 案例代码(关键逻辑)

interface TreeNode {name: stringvalue: anychildren: any[]itemStyle?: {  // 🌟 可选属性color: stringborderColor?: string  // 嵌套可选}symbol?: string  // 🌟 可选属性
}function convertNode(node: any): TreeNode {const result: TreeNode = {name: '...',value: node.id,children: []}// 条件式添加属性if (node.status === 2) {result.itemStyle = {  // ✅ 安全赋值color: '#000',borderColor: '#000'  // ✅ 可选嵌套属性}result.symbol = 'circle'  // ✅ 安全赋值}return result
}

3.2 关键操作解析

操作类型安全性说明
result.itemStyle = ...✅ 安全TS知道itemStyle是可选
访问node.itemStyle⚠️ 需校验必须使用可选链(?.)或判断

四、💻 最佳实践(附速查表)

4.1 使用原则

  1. 最小可选原则:仅对真正动态的属性使用?
  2. 防御性访问:用obj.prop?.subProp替代obj.prop.subProp
  3. 类型收窄:通过if('prop' in obj)校验存在性

4.2 速查表

场景代码示例说明
定义可选属性interface T { prop?: string }基础语法
安全访问const v = obj.prop?.trim()避免Cannot read...
类型守卫if ('prop' in obj) { ... }收窄类型
删除可选属性delete obj.prop需显式操作

五、🚀 总结与延伸

类比理解:把对象看作汽车配置,可选属性就是「天窗」等可选配置
扩展知识:可选属性与Partial<T>工具类型的关系
实战建议:在Vue/React状态管理中大量应用此特性

最后的小挑战:尝试改造以下接口,使其tags属性成为可选:

interface User {id: numbername: stringtags: string[]  // 👈 改为可选
}

✨ 提示答案

interface User {id: numbername: stringtags?: string[]  // ✅ 加?号即可
}

掌握可选属性,让您的TypeScript代码既安全又灵活!🎉

在这里插入图片描述

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

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

相关文章

React+Ant Design的Layout布局实现暗黑模式切换

目录 效果预览完整代码我遇到的BUG问题代码BUG1&#xff1a;暗黑模式下内容区不变成深色BUG2&#xff1a;光亮模式下的左右区域是深色 补充知识ConfigProvider是什么&#xff1f;Ant Design中的theme如何使用&#xff1f;theme 配置的常见字段主题算法通过 useToken 获取主题 效…

把生产队的大模型Grok 3 beta用来实现字帖打磨

第一个版本&#xff0c;就是简单的田字格&#xff0c;Grok 3 beta 思考了15s就得到了html前端代码&#xff0c;javascript; 然而还不完美&#xff1b; 第二个版本&#xff0c;进一步&#xff0c;通过pinyin项目给汉字加上注音&#xff0c;米字格和四线格&#xff1b;&#xff…

【操作系统安全】任务3:Linux 网络安全实战命令手册

目录 一、基础网络信息获取 1. 网络接口配置 2. 路由表管理 3. 服务端口监控 二、网络监控与分析 1. 实时流量监控 2. 数据包捕获 3. 网络协议分析 三、渗透测试工具集 1. 端口扫描 2. 漏洞利用 3. 密码破解 四、日志审计与分析 1. 系统日志处理 2. 入侵检测 3…

2024年MathorCup数学建模A题移动通信网络中PCI规划问题解题全过程文档加程序

2024年第十四届MathorCup高校数学建模挑战赛 A题 移动通信网络中PCI规划问题 原题再现&#xff1a; 物理小区识别码(PCI)规划是移动通信网络中下行链路层上&#xff0c;对各覆盖小区编号进行合理配置&#xff0c;以避免PCI冲突、PCI混淆以及PCI模3干扰等现象。PCI规划对于减少…

Spring安装和使用(Eclipse环境)

一、Spring框架概述 1、 什么是Spring Spring是一个开源框架&#xff0c;Spring是于2003 年兴起的一个轻量级的Java 开发框架&#xff0c;由Rod Johnson 在其著作Expert One-On-One J2EE Development and Design中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复…

【Android Studio开发】生命周期、Activity和组件通信(上)

零、前期配置 1.【Android】模式 2.点击【运行】&#xff0c;弹出模拟器 右侧是模拟机&#xff0c;显示Hello World 3. 打开【activity_main.xml】文件&#xff0c;点击【Design】&#xff0c;然后点击【Component Tree】 在弹出的Component Tree中右键【main】,选择【Conver…

bug:uni-file-picker上传图片报错,文件选择器对话框只能在由用户激活时显示,跨域cors

uni-file-picker上传图片报错&#xff0c;文件选择器对话框只能在由用户激活时显示&#xff0c;跨域has been blocked by CORS policy 参考文档 解决方案&#xff1a;在云服务空间配置localhost跨域

Python学习笔记(6)

Python学习笔记&#xff08;6&#xff09; 第13节课 函数基础1.函数定义与调用2.函数的返回值3.局部变量与全局变量 第13节课 函数基础 对于任何一个知识点&#xff0c;必须讨论的三个问题&#xff1a; &#xff08;1&#xff09;它是啥 &#xff08;2&#xff09;为啥有它 …

RISC-V AIA学习2---IMSIC

我在学习文档这章时&#xff0c;对技术术语不太理解&#xff0c;所以用比较恰当的比喻来让自己更好的理解。 比较通俗的理解&#xff1a; 将 RISC-V 系统比作一个工厂&#xff1a; hart → 工厂的一条独立生产线IMSIC → 每条生产线配备的「订单接收员」MSI 中断 → 客户通过…

目标检测20年(一)

今天看的文献是《Object Detection in 20 Years: A Survey》&#xff0c;非常经典的一篇目标检测文献&#xff0c;希望通过这篇文章学习到目标检测的基础方法并提供一些创新思想。 论文链接&#xff1a;1905.05055 目录 一、摘要 1.1 原文 1.2 翻译 二、介绍 三、目标检测…

AI Agent开发大全第八课-Stable Diffusion 3的本地安装全步骤

前言 就像我们前面几课所述,本系列是一门体系化的教学,它不像网上很多个别存在的单篇博客走“吃快餐”模式,而是从扎实的基础来带领大家一步步迈向AI开发高手。所以我们的AI课程设置是相当全面的,除了有牢固的基础知识外还有外面互联网上也搜不到的生产级实战。 前面讲过…

Hadoop集群搭建(hdfs、yarn)

Hadoop 是 Apache 软件基金会旗下的一个开源项目&#xff0c;是用于处理大数据的分布式系统基础架构&#xff0c;被广泛应用于大数据存储、处理和分析等场景。 一、核心组件 1、Hadoop 分布式文件系统&#xff08;HDFS&#xff09; 具有高容错性&#xff0c;能在低成本硬件上…

数据结构——顺序栈seq_stack

前言&#xff1a;大家好&#x1f60d;&#xff0c;本文主要介绍了数据结构——顺序栈 目录 一、概念 1.1 顺序栈的基本概念 1.2 顺序栈的存储结构 二、基本操作 2.1 结构体定义 2.2 初始化 2.3 判空 2.4 判满 2.5 扩容 2.6 插入 入栈 2.7 删除 出栈 2.8 获取栈顶元…

数据结构初阶-二叉树的应用

1.单值二叉树 题目链接&#xff1a;https://leetcode.cn/problems/univalued-binary-tree/description/ 题目思路&#xff1a;我们把根结点与左孩子和右孩子进行比较&#xff0c;只有左右子树都是单值二叉树的时候才为单值二叉树。但是我们需要先返回的是false&#xff0c;最…

【网络层协议】NAT技术内网穿透

IP地址数量限制 我们知道&#xff0c;IP地址&#xff08;IPv4&#xff09;是一个4字节32位的整数&#xff0c;那么一共只有2^32也就是接近43亿个IP地址&#xff0c;而TCP/IP协议栈规定&#xff0c;每台主机只能有一个IP地址&#xff0c;这就意味着&#xff0c;一共只有不到43亿…

快速入手-基于Django的mysql配置(三)

Django开发操作数据库更简单&#xff0c;内部提供了ORM框架。比如mysql&#xff0c;旧版本用pymysql对比较多&#xff0c;新的版本采用mysqlclient。 1、安装mysql模块 pip install mysqlclient 2、Django的ORM主要做了两件事 &#xff08;1&#xff09;CRUD数据库中的表&am…

ETL:数据清洗、规范化和聚合的重要性

在当今这个数据呈爆炸式增长的时代&#xff0c;数据已成为企业最为宝贵的资产之一。然而&#xff0c;数据的海量增长也伴随着诸多问题&#xff0c;如数据来源多样、结构复杂以及质量问题等&#xff0c;这些问题严重阻碍了数据的有效处理与深度分析。在此背景下&#xff0c;ETL&…

【leetcode hot 100 208】实现Trie(前缀树)

解法一&#xff1a;字典树 Trie&#xff0c;又称前缀树或字典树&#xff0c;是一棵有根树&#xff0c;其每个节点包含以下字段&#xff1a; 指向子节点的指针数组 children。对于本题而言&#xff0c;数组长度为 26&#xff0c;即小写英文字母的数量。此时 children[0] 对应小…

PyTorch生成式人工智能实战:从零打造创意引擎

PyTorch生成式人工智能实战&#xff1a;从零打造创意引擎 0. 前言1. 生成式人工智能1.1 生成式人工智能简介1.2 生成式人工智能技术 2. Python 与 PyTorch2.1 Python 编程语言2.2 PyTorch 深度学习库 3. 生成对抗网络3.1 生成对抗网络概述3.2 生成对抗网络应用 4. Transformer4…

vue中上传接口file表单提交二进制文件流

1.使用elementui上传组件 要做一个选择文件后&#xff0c;先不上传&#xff0c;等最后点击确定后&#xff0c;把file二进制流及附加参数一起提交上去。 首先使用elementui中的上传组件&#xff0c;设置auto-uploadfalse&#xff0c;也就是选择文件后不立刻上传。 <el-uplo…