JS Flow:如何初始化一个空对象并将类型设置为函数的参数?

时间:2016-11-25 18:13:08

标签: javascript reactjs redux

我有一个React reducer,它设置一个作为对象的活动用户。我希望初始状态是一个空对象{}。但是,我无法弄清楚语法。这是我的尝试:

// @flow
import { SET_ACTIVE_USER } from '../actions/types';

type action = {
  type: string,
  payload: Object,
};

const state: Object = {};

export default (state: state, action: <action>) => {
  switch(action.type) {
    case SET_ACTIVE_USER:
      return action.payload;
  }

  return state;
}

我也试过这样做: (state: Object = {}, action: <action>)但它也不起作用。

这是运行flow的完整错误消息:

12: export default (state: state, action: <action>) => { ^ Unexpected token ,

另一种尝试是模仿这样工作的参数:

// @flow
...

type state = {};

export default (state: <state>, action: <action>) : Object => {
...

我已经阅读了文档但我找不到正确的语法。

我在其他地方遇到语法错误并将其修改为将其转换为此似乎已经有效。不确定为什么会出现这种情况。

export default (state: Object = {}, action: action) : Object => {

所以,我猜我的问题变成了,正确的方法是什么?

由于

2 个答案:

答案 0 :(得分:0)

我认为state的类型为any。例如,类型Object没有成员a(在这种情况下只是一个示例)。

/* @flow */

type state = {
  [key: string] : any
};

type ACTION_TYPE = string;

interface action {
    type: ACTION_TYPE,
    payload: any
}

export default (action: action, state: state): state => {

    return { a: '' };
};

  

编辑   type state = any可以是偶数type state = {[key: string]: any},因为断言这是一个带有string类型键的对象。

edits declaring state as Object: try to have a look at this playground

答案 1 :(得分:0)

试试const state: {[string]: mixed}(Object as map)

您应该避免使用any https://flow.org/en/docs/types/any/#toc-avoid-leaking-any,因为它很容易泄漏。

那就是说,你应该为你的减速机提供一个完整的初始状态。如果你走这条路并想知道如何使用Flow with Redux,那么关于here主题的文档很好。