Typescript 中根据某个字段判断其他字段是否必传
创始人
2024-02-10 04:04:25
0

背景

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

type BasicItem = {label: stringvalue: number
}
type BrandItem = BasicItem & {}type PruductionItem = BasicItem & {}type HeaderPropsType = {hideSearch?: booleanbrandOptions: []productionOptions: []
}
function Header(props: HeaderPropsType) {}

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

解决方法

1. 添加默认值

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

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

2. 函数重载

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

type BasicItem = {label: stringvalue: number
}type BrandItem = BasicItem & {}
type ProductionItem = BasicItem & {}type RequiredType = {brandOptions: BrandItem[]productionOptions: ProductionItem[]
}type OptionalType = Partial
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 extends { hideSearch: true }? T: T & OptionListTypeexport type HeaderPropsType = T extends BasicProps ? HeaderProps : {} // 这里最后的 {} 也可以换成别的类型
function Header({hideSearch = false}: HeaderPropsType) {}// 使用组件的时候,就可以这样使用啦,也会有类型提示
[]} productOpts={[]} />
true} />

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

总结

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

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
客厅放八骏马摆件可以吗(家里摆... 今天给各位分享客厅放八骏马摆件可以吗的知识,其中也会对家里摆八骏马摆件好吗进行解释,如果能碰巧解决你...
美团联名卡审核成功待激活(美团... 今天百科达人给各位分享美团联名卡审核成功待激活的知识,其中也会对美团联名卡审核未通过进行解释,如果能...