Typescript 中根据某个字段判断其他字段是否必传

news2024/11/19 2:39:05

背景

我在使用 Typescript 的时候遇到过这样的一个问题。我有这样的一个组件
在这里插入图片描述
前面的两个搜索框是根据参数判断是否要隐藏的,Typescript 的类型定义就是这样的

type BasicItem = {
	label: string
	value: number
}
type BrandItem = BasicItem & {}

type PruductionItem = BasicItem & {}

type HeaderPropsType = {
	hideSearch?: boolean
	brandOptions: []
	productionOptions: []
}
function Header(props: HeaderPropsType) {}

如果这样写的话就不能满足要求,我希望是当 hideSearch = true 的时候,brandOptionsproductionOptions 才为必传属性,当他为 false 或者不传的时候,是非必传属性。

解决方法

1. 添加默认值

这个应该是最简单的方法了,如果你不传的话,我给你添加一个空数组不就完事了吗?也不会因为不传而导致在 undefined 上取方法属性而报错

type HeaderPropsType = {
	hideSearch?: boolean
	brandOptions?: []
	productionOptions?: []
}
function Header({ hideSearch, brandOptions=[], productionOptions=[] }: HeaderPropsType) {}

2. 函数重载

如果是普通函数的话,可以是用函数重载的方式,大致这样,看起来好像挺复杂的,思想还是比较简单的,就是相当于我定义了几种不同情况的函数的参数和返回值而已。但是这种就不适合用在 React 函数组件上了
可以点击这里在线体验一下

type BasicItem = {
	label: string
	value: number
}

type BrandItem = BasicItem & {}
type ProductionItem = BasicItem & {}

type RequiredType = {
    brandOptions: BrandItem[]
    productionOptions: ProductionItem[]
}

type OptionalType = Partial<RequiredType>
type RequiredHideSearch = { hideSearch: true}
type OptionalHideSearch = { hideSearch?: false}

// 函数重载需要紧跟着实现
function test(props: OptionalHideSearch & RequiredType): void
function test(props: RequiredHideSearch & OptionalType): void
function test(props) {
    return props
}
// 这样调用都是可以的
test({ hideSearch: true })
test({ brandOptions: [], productionOptions: [] })
test({ hideSearch: false, brandOptions: [], productionOptions: [] })

3. 类型运算

这是我比较喜欢的一种方式,当然用默认值是最简单的,也不用去定义那么多类型,但是我总觉得写 typescript,写了那么久,好像就只会这种简单的类型添加,看源码的时候,也很难看懂人家的类型为啥这么写。

type BasicProps = {
    hideSearch?: boolean
}
// 如果 hideSearch = true 就使用 T(就是BasicProps)
// 否则则使用 T & OptionListType
// 就是一个简单的三元表达式
export type HeaderProps<T> = T extends { hideSearch: true }
    ? T
    : T & OptionListType

export type HeaderPropsType<T> = T extends BasicProps ? HeaderProps<T> : {} // 这里最后的 {} 也可以换成别的类型
function Header<T extends BasicProps>({hideSearch = false}: HeaderPropsType<T>) {}

// 使用组件的时候,就可以这样使用啦,也会有类型提示
<Header brandOpts={[]} productOpts={[]} />
<Header hideSearch={true} />

其实这里也体现了 Typescript 中,interfacetype 的一个区别,interface 就不能进行这些三元运算符的操作

总结

其实这个问题我也是问别人的,他们都说我搞那么麻烦干嘛,直接默认值不就搞定了吗?
在这里插入图片描述
但是我总觉得多总结总结方法,可以在以后开发的时候,思路多一些,不会只握着手中仅有的知识,止步不前。多探索探索嘛,不然总觉得自己在搬砖,多回头看看以前写的代码,有机会的话,可以总结或者优化一些,这样就不会觉得自己整天都在干相同的事情啦

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

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

相关文章

Linux19 --- 线程同步、用户级和内核级线程、互斥锁、信号量、读写锁、条件变量

一、线程同步 线程同步指的是当一个线程在对某个临界资源进行操作时&#xff0c;其他线程都不可以对这个资源进行操作&#xff0c;直到该线程完成操作&#xff0c;其他线程才能操作&#xff0c;也就是协同步调&#xff0c;让线程按预定的先后次序进行运行。 线程同步的方法有…

Windows OpenGL 图像透明度调节

目录 一.OpenGL 图像透明度 1.原始图片2.效果演示 二.OpenGL 图像透明度源码下载三.猜你喜欢 零基础 OpenGL ES 学习路线推荐 : OpenGL ES 学习目录 >> OpenGL ES 基础 零基础 OpenGL ES 学习路线推荐 : OpenGL ES 学习目录 >> OpenGL ES 特效 零基础 OpenGL ES …

Arduino开发实例-SR04T/SR04M 防水超声波传感器驱动

SR04T/SR04M 防水超声波传感器驱动 本文展示如何通过SR04T 防水超声波传感器获取距离数据。 本文还将讨论该模块的工作原理以及将数据处理。 1、SR04T/SR04M介绍 SR04T/SR04M超声波测距模块可提供21cm-600cm的非接触式距离感测功能,测距精度可达高到3mm;模块包括收发一体的…

python 的cut与qcut

我想要实现多分类&#xff0c;样本不是均匀分布的 使用cut&#xff0c;可以实现自定义范围分类 使用qcut&#xff0c;可以实现每个 分类的个数大致相等 cut 与 qcut方法使用 参考 https://www.cnblogs.com/Motimer/p/16006313.html 1、cut方法 pandas.cut(x, bins, rightT…

x86和arm框架下的centOS

1 CPU架构分为 X86 &#xff0c; ARM &#xff0c;MIPS &#xff0c; power , ia64 AMD64 X86_64 x64 ,是64位的CPU 架构&#xff0c;区分ARM64 1.x86 &#xff1a; 复制指令集cisc,高性能&#xff0c;速度快&#xff0c;完成量打&#xff08;内存&#xff0c;硬盘&#xf…

NoSQLBooster4MongoDB - 用SQL查询MongoDB

最好的MongoDB的客户端工具–NoSQLBooster。NoSQLBooster立志做“The Smartest IDE for MongoDB”。 使用 mb.runSQLQuery()方法,能把SQL语句翻译成MongoDB的查询语句. 借助适用于 MongoDB 的 NoSQLBooster&#xff0c;您可以针对 MongoDB 运行 SQL SELECT 查询。 SQL 支持包…

离线安装PostgreSQL数据库(v13.4版本)

记录&#xff1a;328 场景&#xff1a;在CentOS 7.9操作系统上&#xff0c;离线安装PostgreSQL数据库&#xff0c;版本&#xff1a;v13.4。主要是PostgreSQL的编译、安装、启动、登录、设置远程可登录、创建数据库、创建数据库用户等。 版本&#xff1a; 操作系统&#xff1…

转铁蛋白修饰硬脂酸/棕榈酸 TF-PEG-C18 Stearic Acid/C16, palmitic acid

产品名称&#xff1a;转铁蛋白-聚乙二醇-硬脂酸 英文名称&#xff1a;TF-PEG-C18 Stearic Acid 纯度&#xff1a;95% 存储条件&#xff1a;-20C&#xff0c;避光&#xff0c;避湿 外观:固体或粘性液体&#xff0c;取决于分子量 PEG分子量可选&#xff1a;350、550、750、1k、2k…

G. Good Key, Bad Key(暴力)

Problem - 1703G - Codeforces 有n个箱子。第i个箱子里有ai个硬币。你需要按顺序打开所有n个箱子&#xff0c;从箱子1到箱子n。 你可以用两种类型的钥匙来打开箱子。 一把好钥匙&#xff0c;使用它需要花费k个硬币。 坏钥匙&#xff0c;不需要花费任何金币&#xff0c;但会将…

操作系统:进程的创建(fork函数)、进程的替换(exec函数)

文章目录1.进程的创建2.进程的替换3.进程的阻塞1.进程的创建 ①调用fork函数的进程为父进程&#xff0c;调用后生成一个子进程&#xff1b; ②创建子进程成功时&#xff0c;父进程中fork函数的返回值是子进程的进程号PID&#xff1b; ③创建子进程失败时&#xff0c;父进程中fo…

使用.NET简单实现一个Redis的高性能克隆版(一)

正文 我遇到了这个项目&#xff0c;它的目标是成为一个比Redis有着更好性能和更易用的克隆版。我发现它很有趣&#xff0c;因为它主要的卖点之一就是它是在多线程模式下运行&#xff08;而不是像Redis那样是单线程&#xff09;。他们使用memtier_benchmark&#xff08;Redis项…

shell命令以及运行原理

shell命令以及运行原理shell命令以及运行原理shell命令以及运行原理 Linux严格意义上来说说的是操作系统&#xff0c;我们把操作系统称之为“内核”&#xff08;kernel&#xff09;&#xff0c;但是我们用户是不会直接与kernel直接打交道的&#xff0c;我们是通过一个“外壳程…

D. Fixed Point Guessing(二分+交互式问题)

Problem - D - Codeforces 这是一个互动问题。 最初&#xff0c;有一个数组a[1,2,...,n]&#xff0c;其中n是一个奇数正整数。陪审团选择了n-12对不相干的元素&#xff0c;然后对这些元素进行交换。例如&#xff0c;如果a[1,2,3,4,5]&#xff0c;对1↔4和3↔5进行互换&#xf…

吐血经验,怎么把OAK相机的镜头模组拆下来?

消息快播&#xff1a;OpenCV众筹了一款ROS2机器人rae&#xff0c;开源、功能强、上手简单。来瞅瞅~ 编辑&#xff1a;OAK中国 首发&#xff1a;oakchina.cn 喜欢的话&#xff0c;请多多&#x1f44d;⭐️✍ 内容可能会不定期更新&#xff0c;官网内容都是最新的&#xff0c;请查…

[AI] LRTA*(K) 搜索算法

LRTA*[k]搜索算法 一、理论二、实际应用步骤一、理论 LRTA*(K) 是LRTA* 算法的进阶版&#xff0c;关于LRTA*的回顾请点此处&#xff0c; LRTA*(K) 论文请点此处 该文作者把LRTA算法归为 无界传播(unbounded propagation, 中文用谷歌翻译的。。。囧)&#xff0c;LRTA(K)归为有…

第四章:JVM运行时参数

一、JVM参数选项类型类型一&#xff1a;标准参数选项类型二&#xff1a;-X参数选项类型三&#xff1a; -XX参数选项二、常用的 JVM 参数选项打印设置的 XX 选项及值堆、栈、方法区的参数栈堆方法区垃圾回收器相关参数Serial回收器ParNew 回收器ParallelGcCMS回收器G1 回收器如何…

Win11杜比全景声无法正常运行的解决方法教学

Win11杜比全景声无法正常运行的解决方法教学。我们的电脑开启杜比声全景音效之后&#xff0c;无论是看电影&#xff0c;还是听音乐&#xff0c;都可以获得更加良好的视听体验。但是有用户却遇到了电脑无法正常的开启杜比声音效的问题&#xff0c;一起来看看如何去解决的方法吧。…

【Selenium】Selenium4 Grid

Selenium Grid: 将客户端发送的命令转发到远程浏览器上执行 WebDriver 脚本。 简介 Selenium Grid 是由一个 hub 服务和若干个 node 代理节点组成。 Hub 调度服务&#xff0c;管理各个代理节点的注册信息和状态信息&#xff0c;并且接收来自客户端代码的调用请求&#xff0c;…

13.练习题(年月日,打字游戏)

练习 1.任意给出一个年、月、日&#xff0c;判断是这一年的第几天&#xff1a;闰年算法&#xff1a;能被4整除且不能被100整除&#xff0c;或者能被400整除。 如&#xff1a;2012 5 10 是这一年的第131天。 提示&#xff1a;使用数组的方式计算&#xff0c;将每月的天数放在一…

面试学习总结

之前根据视频做的总结&#xff0c;备个份。 一、Volatile关键字 volatile是Java虚拟机提供的轻量级的同步机制。 三个特性&#xff1a; 保证可见性 线程修改了工作内存中的值并写回到主内存之后&#xff0c;主内存立刻通知所有线程。称为可见性。&#xff08;结合JMM理解&am…