定义Redux操作类型的正确方法是什么?

定义Redux操作类型的正确方法是什么?,redux,flowtype,Redux,Flowtype,我有一个使用Redux进行状态管理的应用程序,我正在尝试添加流类型注释 我在这里创建了一个非常简单的测试用例,概述了我遇到的问题 我创建了一个unionAction类型,然后在一个reducer函数中,我使用switch根据Action的type属性来决定返回什么状态。在switch语句的每种情况下,我都在访问我的action参数上的不同属性 我不明白为什么Flow告诉我它在操作参数上找不到某些属性。一切似乎都被正确地定义了,我真的看不出这里有什么错 下面是我的测试用例: 我认为这个问题可能与

我有一个使用Redux进行状态管理的应用程序,我正在尝试添加流类型注释

我在这里创建了一个非常简单的测试用例,概述了我遇到的问题

我创建了一个union
Action
类型,然后在一个reducer函数中,我使用
switch
根据Action的
type
属性来决定返回什么状态。在switch语句的每种情况下,我都在访问我的
action
参数上的不同属性

我不明白为什么Flow告诉我它在
操作
参数上找不到某些属性。一切似乎都被正确地定义了,我真的看不出这里有什么错

下面是我的测试用例:

我认为这个问题可能与使用
switch
语句有关,因此这里有一个使用
if
的版本,具有相同的问题:


首先,请注意,
reduce
函数不是有效的reducer。redux reducer必须具有以下签名

(state: State, action: Action) => State
Flow对优化持悲观态度(理论上,您可以更改回调中的
action.data
引用)。帮助流保持优化的一种方法是使用常量绑定()

或者,在我看来,更好的做法是,将案例拆分为几个助手函数

function findIndex(state: State, id): number {
  return state.list.findIndex(item => item.id === id);
}

function reduce(state: State, action: Action): number {
  switch (action.type) {
    case 'FIRST': 
      return findIndex(state, action.data.id)
    case 'SECOND': 
      return findIndex(state, action.itemId)
    default:
      return 0;
  }
}

此外,您可以在redux repo中找到流类型应用程序的示例(请参见示例/todos流)

首先,请注意,您的
reduce
函数不是有效的reducer。redux reducer必须具有以下签名

(state: State, action: Action) => State
Flow对优化持悲观态度(理论上,您可以更改回调中的
action.data
引用)。帮助流保持优化的一种方法是使用常量绑定()

或者,在我看来,更好的做法是,将案例拆分为几个助手函数

function findIndex(state: State, id): number {
  return state.list.findIndex(item => item.id === id);
}

function reduce(state: State, action: Action): number {
  switch (action.type) {
    case 'FIRST': 
      return findIndex(state, action.data.id)
    case 'SECOND': 
      return findIndex(state, action.itemId)
    default:
      return 0;
  }
}

此外,您可以在redux repo中找到流类型应用程序的示例(请参见示例/todos flow)

不知道流的作用,如果确实是动作所要发送的,则还原器看起来很好。flow是否在这里使用了redux,或者您只是在测试您认为redux在做什么?这两件事是分开的,我只是尝试将flow类型注释添加到我的redux操作和缩减器中。明白了。不知道你上次编辑是什么意思-为什么你会认为那是一个错误?呃,是的,你是对的,那不会是一个错误,我犯了一个错误。我将删除它。由于不知道流是做什么的,如果这确实是动作应该发送的,那么你的减缩器看起来很好。flow是否在这里使用了redux,或者您只是在测试您认为redux在做什么?这两件事是分开的,我只是尝试将flow类型注释添加到我的redux操作和缩减器中。明白了。不知道你上次编辑是什么意思-为什么你会认为那是一个错误?呃,是的,你是对的,那不会是一个错误,我犯了一个错误。我将删除它。如何使用常量而不是字符串?如何使用常量而不是字符串是愚蠢的?这很愚蠢