Javascript 使用导入常量中的流-操作类型名称进行React redux
我正在使用Redux在React应用程序中使用Flow进行类型检查,并且需要根据动作类型检查减速器中的动作形状,如下所述: 减速器代码: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
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'代码>成功了!