Javascript 使用导入常量中的流-操作类型名称进行React redux

Javascript 使用导入常量中的流-操作类型名称进行React redux,javascript,react-redux,flowtype,Javascript,React Redux,Flowtype,我正在使用Redux在React应用程序中使用Flow进行类型检查,并且需要根据动作类型检查减速器中的动作形状,如下所述: 减速器代码: import { ADD_USER, DELETE_USER } from './actionTypes' type State = { users: { [userId: number]: { name: string, age: number } } }; // exact State shape is not important for this

我正在使用Redux在React应用程序中使用Flow进行类型检查,并且需要根据动作类型检查减速器中的动作形状,如下所述:

减速器代码:

import { ADD_USER, DELETE_USER } from './actionTypes'

type State = {
  users: { [userId: number]: { name: string, age: number } }
};  // exact State shape is not important for this case

type Action = 
  |{ type: ADD_USER, user: {name: string, age: number} }
  |{ type: DELETE_USER, userId: number };

function reducer(state: State, action: Action): State {
  switch(action.type) {
    case ADD_USER:
      return { ...state, users: { ...state.users, action.user } };

    case DELETE_USER:
      const { action.userId, ...newUsers } = state.users
      return { ...state, users: newUsers };

    default:
      return state;
  }

这不起作用,给定流错误
无法获取“action.userId”,因为对象类型中缺少属性“userId”

在同一文件中将动作类型定义为常量时,类型检查起作用:

// import { ADD_USER, DELETE_USER } from './actionTypes'

const ADD_USER = 'ADD_USER';
const DELETE_USER = 'DELETE_USER';

type State = {
  users: { [userId: number]: { name: string, age: number } }
};  // exact State shape is not important for this case

type Action = 
  |{ type: ADD_USER, user: {name: string, age: number} }
  |{ type: DELETE_USER, userId: number };

function reducer(state: State, action: Action): State {
  switch(action.type) {
    case ADD_USER:
      return { ...state, users: { ...state.users, action.user } };

    case DELETE_USER:
      const { action.userId, ...newUsers } = state.users
      return { ...state, users: newUsers };

    default:
      return state;
  }

需要将动作类型名称作为字符串常量导入,因为它们也是在动作创建者中导入的,这样可以将它们全部定义在一个文件
actionTypes.js
(有点像react-redux的标准方法)


如何使用导入的常量执行不相交并集的流类型检查?

我认为需要做一些事情

1) 将类型添加到
actionTypes.js
中的操作类型。确保按如下方式在此处指定操作类型:

const ADD_USER: 'ADD_USER' = 'ADD_USER';
const DELETE_USER: 'DELETE_USER' = 'DELETE_USER';
2) 在reducer代码中操作类型的注释中,确保使用操作类型的类型而不是值,如下所示:

import { ADD_USER, DELETE_USER } from './actionTypes'

type Action = 
  |{ type: typeof ADD_USER, user: {name: string, age: number} }
  |{ type: typeof DELETE_USER, userId: number };

3) 请确保所有其他代码都是有效的JavaScript,因为
用户:{…state.users,action.user}
{action.userId,…newUsers}=state.users
看起来不像是合法的方法来分解和创建新对象。

我认为需要做一些事情

1) 将类型添加到
actionTypes.js
中的操作类型。确保按如下方式在此处指定操作类型:

const ADD_USER: 'ADD_USER' = 'ADD_USER';
const DELETE_USER: 'DELETE_USER' = 'DELETE_USER';
2) 在reducer代码中操作类型的注释中,确保使用操作类型的类型而不是值,如下所示:

import { ADD_USER, DELETE_USER } from './actionTypes'

type Action = 
  |{ type: typeof ADD_USER, user: {name: string, age: number} }
  |{ type: typeof DELETE_USER, userId: number };

3) 确保所有其他代码都是有效的JavaScript,因为
用户:{…state.users,action.user}
{action.userId,…newUsers}=state.users
看起来不像合法的方法来进行新对象的解构和创建。

谢谢@frontendgirl,这个符号:
const ADD_user:'ADD_user'='ADD_user'成功了!谢谢@frontendgirl,这个符号:
const ADD_USER:'ADD_USER'='ADD_USER'成功了!