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
的类型参数以允许使用任何一种类型调用时,它会起作用,即说“如果您传递一个数字,我可以忽略它,并且只有在您传递布尔值时才执行操作。”类型系统认为它可以将a
number
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
  )
}