reactjs - Typescript React 道具类型有两种可能性
问题描述
我正在尝试在我的新 React 项目中学习和实现 Typescript。我有一个ToggleButton
我想在两个场合使用的组件sorting
和filtering
产品。每个切换选项都有自己的按钮,但取决于它是一个sorting
还是filtering
选项,会有细微的差别
type OrderBy = {
value: ProductOrderBy
children: ReactNode
onClick: (arg0: ProductOrderBy) => void
}
type SizeFilter = {
value?: ProductSize
children: ReactNode
onClick: (arg0?: ProductSize) => void
}
const ToggleButton = ({ value, children, onClick }: OrderBy | SizeFilter) => {
const handleClick = () => onClick(value)
return <Button onClick={handleClick}>{children}</Button>
}
如您所见,如果它是一个filter
选项,则value
是可选的。因为value
在回调中用作参数,所以回调参数也是可选的。
我希望工会|
会声明道具必须匹配OrderBy
orSizeFilter
类型。但在我的 IDE 的智能感知中,这两种类型似乎都合并了。
我的代码按预期工作,但我的 IDE 告诉我onClick(value)
以下内容:Argument of type 'ProductOrderBy | ProductSize | undefined' is not assignable to parameter of type 'never'.
我可以想出很多解决方法来解决这个问题,但是由于我仍在尝试学习 Typescript,我想知道为什么我的打字没有按预期工作......?
解决方案
const ToggleButton = ({ value, children, onClick }: OrderBy | SizeFilter) => {
if(!value) {
return null;
}
const handleClick = () => onClick(value)
return <Button onClick={handleClick}>{children}</Button>
}
这是因为 SizeFilter 的值可以是未定义的。
推荐阅读
- r - R轮添加额外零的问题
- excel - Excel 单元格的行号作为其他单元格值的函数
- python - gdal.Translate 将批量 asc 转换为 geotiff
- python - 如何在没有错误的情况下关闭文件打开器?
- mysql - 如何为另一个查询的每个结果正确执行 MySQL 查询?
- c++ - 根据模板参数的类型返回一个值
- javascript - 使用 aws-cognito-identity-js 时获取的类型错误
- active-directory - 有人在 3389 上使用 RDP 访问我们的服务器吗?
- python - Tensorflow Keras嵌入层错误:层权重形状不兼容
- rest - 在一个 RESTful API 请求中从两个不同的表中删除资源