Javascript 具有redux的流-传递联合类型导致错误
我有这种类型:Javascript 具有redux的流-传递联合类型导致错误,javascript,redux,flowtype,Javascript,Redux,Flowtype,我有这种类型: export type Action<P> = { type: string, payload: P } export type ActionT = Action<boolean | string | number> export const updateAlertModalIsOpen: ActionCreator<ActionT, boolean> = ( payload ) => ({ type: UPDATE_
export type Action<P> = {
type: string,
payload: P
}
export type ActionT = Action<boolean | string | number>
export const updateAlertModalIsOpen: ActionCreator<ActionT, boolean> = (
payload
) => ({
type: UPDATE_ALERT_MODAL_IS_OPEN,
payload
})
它也不允许我做动作
错误是:
无法调用bindActionCreators
,因为数字[1]不兼容
在类型参数P
[3]的类型参数A
[4]中使用布尔[2]
类型参数C
的属性updateAlertModalHeight
。(参考文献:
[1] [2][3][4])流量
我哪里做错了
以下是错误消息中的updateAlertModalHeight
:
export const updateAlertModalHeight: ActionCreator<Action<number>, number> = (
payload
) => ({
type: UPDATE_ALERT_MODAL_HEIGHT,
payload
})
以及:
const-mapDispatchToProps=(调度:调度)=>{
但这是一种不太具体的类型,它很糟糕,因为它没有描述返回的操作类型
我想编辑redux类型定义以允许多个操作类型,但很难理解要做什么更改。分派的泛型类型参数是不变的,这意味着它不能是您指定的之外的任何内容,尤其是不能专门用于
number
来自boolean | number
。直观地说,类型信息number
比boolean | number
更具体
实际问题是bindActionCreators
的类型,它强制执行与dispatch
to相同的类型参数,updatealModalHeight
、和updatealModalSiOpen
。但这些函数采用不同类型的参数!一个取数字,一个取a布尔值,因此类型检查器无法正确推断类型。当您更改updateAlertModalHeight
和updateAlertModalIsOpen
的类型参数以允许使用任何一种类型调用时,它会起作用,即说“如果您传递一个数字,我可以忽略它,并且只有在您传递布尔值时才执行操作。”类型系统认为它可以将anumber
和boolean
传递给函数,因此所有类型都会检查
这里真正的解决方案不依赖于改变参数类型,将是对
bindActionCreators
进行两次调用,一次调用编号-分派,一次调用布尔值-分派向前推进,通过摆脱自定义类型动作,我已经获得了安静的流
和am导入Redux的类型操作
例如从“Redux”导入类型{Action}
。Redux使用的是
declare export type Action<T> = {
type: T
}
mapDispatchToProps变为:
const mapDispatchToProps = (dispatch: Dispatch<Action<string>>) => {
return bindActionCreators(
{
updateAlertModalIsOpen,
updateAlertModalHeight,
updateHasYesNo: updateAlertModalHasYesNo
},
dispatch
)
}
const-mapDispatchToProps=(调度:调度)=>{
返回bindActionCreators(
{
updateAlertModalIsOpen,
更新模式高度,
UpdateAsysteNo:updateAlertModalHasYesNo
},
派遣
)
}
谢谢!这很奇怪,但是当我将通配符传递给Dispatch时,我得到了关于混合类型number和boolean的相同错误。我认为它使用类型推断来查看操作的不同,并禁止它。我尝试在同一mapDispatchToProps中调用bindActionCreators两次,但第二次调用不起作用。有没有办法让它更有效特定动作和动作继承自ActionT,因此成为ActionT?或者在使用它们时将它们转换为ActionT?该死,我不应该在工作时心不在焉地回答这么多问题。通配符不起作用:这与数字|布尔值
不起作用的原因相同。在通配符的情况下,类型会专门化为其中一种类型首先,然后就不适合另一个了。所以请擦掉这一点,我将编辑我的答案。我认为从概念上讲,bindActionCreators
的编写方式,您不能传入一个通用分派,而期望调用内部具有不同参数类型的函数。谢谢。您知道如何对bindActionCreator进行两次调用吗?我找不到n示例联机。这似乎并不常见。我尝试通过不返回bindActionCreator调用来同时执行这两种操作,而只是调用它们,但这使AlertModal组件在模式中不显示警报消息,因此我两次调用它的方式有问题。
const mapDispatchToProps = (dispatch: Dispatch<ActionT>) => {
declare export type Action<T> = {
type: T
}
export const updateAlertModalIsOpen: ActionCreator<Action<string>, boolean> = (
payload
) => ({
type: UPDATE_ALERT_MODAL_IS_OPEN,
payload
})
const mapDispatchToProps = (dispatch: Dispatch<Action<string>>) => {
return bindActionCreators(
{
updateAlertModalIsOpen,
updateAlertModalHeight,
updateHasYesNo: updateAlertModalHasYesNo
},
dispatch
)
}