热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

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




背景

我在使用 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 &#61; Partial<RequiredType>
type RequiredHideSearch &#61; { hideSearch: true}
type OptionalHideSearch &#61; { 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. 类型运算

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

type BasicProps &#61; {
hideSearch?: boolean
}
// 如果 hideSearch &#61; true 就使用 T&#xff08;就是BasicProps&#xff09;
// 否则则使用 T & OptionListType
// 就是一个简单的三元表达式
export type HeaderProps<T> &#61; T extends { hideSearch: true }
? T
: T & OptionListType
export type HeaderPropsType<T> &#61; T extends BasicProps ? HeaderProps<T> : {} // 这里最后的 {} 也可以换成别的类型
function Header<T extends BasicProps>({hideSearch &#61; false}: HeaderPropsType<T>) {}
// 使用组件的时候&#xff0c;就可以这样使用啦&#xff0c;也会有类型提示
<Header brandOpts&#61;{[]} productOpts&#61;{[]} />
<Header hideSearch&#61;{true} />


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



总结

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







推荐阅读
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • IB 物理真题解析:比潜热、理想气体的应用
    本文是对2017年IB物理试卷paper 2中一道涉及比潜热、理想气体和功率的大题进行解析。题目涉及液氧蒸发成氧气的过程,讲解了液氧和氧气分子的结构以及蒸发后分子之间的作用力变化。同时,文章也给出了解题技巧,建议根据得分点的数量来合理分配答题时间。最后,文章提供了答案解析,标注了每个得分点的位置。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
  • 本文介绍了一个适用于PHP应用快速接入TRX和TRC20数字资产的开发包,该开发包支持使用自有Tron区块链节点的应用场景,也支持基于Tron官方公共API服务的轻量级部署场景。提供的功能包括生成地址、验证地址、查询余额、交易转账、查询最新区块和查询交易信息等。详细信息可参考tron-php的Github地址:https://github.com/Fenguoz/tron-php。 ... [详细]
  • node.jsrequire和ES6导入导出的区别原 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • 本文介绍了Python函数的定义与调用的方法,以及函数的作用,包括增强代码的可读性和重用性。文章详细解释了函数的定义与调用的语法和规则,以及函数的参数和返回值的用法。同时,还介绍了函数返回值的多种情况和多个值的返回方式。通过学习本文,读者可以更好地理解和使用Python函数,提高代码的可读性和重用性。 ... [详细]
  • express工程中的json调用方法
    本文介绍了在express工程中如何调用json数据,包括建立app.js文件、创建数据接口以及获取全部数据和typeid为1的数据的方法。 ... [详细]
  • Python的参数解析argparse模块的学习
    本文介绍了Python中参数解析的重要模块argparse的学习内容。包括位置参数和可选参数的定义和使用方式,以及add_argument()函数的详细参数关键字解释。同时还介绍了命令行参数的操作和可接受数量的设置,其中包括整数类型的参数。通过学习本文内容,可以更好地理解和使用argparse模块进行参数解析。 ... [详细]
author-avatar
chenhe86888
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有