【问题标题】:Getting Flow warning messages with Reducer使用 Reducer 获取流量警告消息
【发布时间】:2019-09-30 15:27:18
【问题描述】:

使用 React Context API,我构建了这个 reducer:

export const usersReducer = (state: UsersState, action: UsersAction) => {
  switch (action.type) {
    case TOGGLE_MODAL: {
      return {
        ...state,
        isModalOpen: !state.isModalOpen
      };
    }

    case CANCEL_REQUEST: {
      return {
        ...state,
        isCancelRequest: action.payload
      };
    }

    case UPDATE_COMPANY: {
      return {
        ...state,
        companyId: action.payload
      };
    }

    default: {
      return state;
    }
  }
}

相关的动作如下所示:

// Note: `ActionType` = `string`
export const TOGGLE_MODAL: ActionType = 'TOGGLE_MODAL';
export const CANCEL_REQUEST: ActionType = 'CANCEL_REQUEST';
export const UPDATE_COMPANY: ActionType = 'UPDATE_COMPANY';

type ToggleModalAction = {type: typeof TOGGLE_MODAL};
type CancelRequestAction = {type: typeof CANCEL_REQUEST, payload: boolean};
type UpdateCompanyAction = {type: typeof UPDATE_COMPANY, payload: number};

export type UsersAction = 
     | ToggleModalAction
     | CancelRequestAction
     | UpdateCompanyAction;

在两个 action.payload 实例上,Flow 是这样说的:

Cannot get `action.payload` because property `payload` is missing in  `ToggleModalAction`

我认为我定义我的 3 个“...Action”类型的方式,我可以在必要的地方包含 payload,在不需要的地方排除它,就像在 ToggleModalAction 中一样。

有什么办法解决这个问题吗?

【问题讨论】:

    标签: flowtype typing react-context


    【解决方案1】:

    通过执行typeof TOGGLE_MODAL 等,您的UsersAction 类型的type 键将始终为string。为了从 Flow 的 disjoint unions 获得类型帮助,您需要的是字符串文字本身:

    type ToggleModalAction = {type: 'TOGGLE_MODAL'};
    type CancelRequestAction = {type: 'CANCEL_REQUEST', payload: boolean};
    type UpdateCompanyAction = {type: 'UPDATE_COMPANY', payload: number};
    

    【讨论】:

    • 我认为case 语句也需要更改为使用字符串文字(例如,'TOGGLE_MODAL')而不是分配的变量。这是一个记录在案的“愿望清单”问题github.com/facebook/flow/issues/8056
    • 我明白了。我刚刚尝试过,确实可以解决问题。但是,使用字符串文字完全违背了引入常量的目的,以减少拼写错误的机会。换句话说,我觉得我正在改变我的编码实践(让它变得更糟)只是为了让 Flow 正常工作。 @Ross Allen,您对此有何看法?
    • @user11307804 啊哈哈,正如我所怀疑的,这是 Flow 的一个缺陷。我将坚持使用常量,因为从根本上说,这是一种比在任何地方引入字符串文字更好的方法。
    • 使用常量被认为是最佳实践,因为 JS 没有类型检查器。当您的代码被 Flow 覆盖时,无需像这样提取常量。如果您提供的字符串不是联合的一部分,Flow 会告诉您。 flow.org/try/…
    • 我会颠倒你的说法,在当前的 Flow + TypeScript 世界中,我想说,引入常量完全违背了使用类型系统的目的!如果您的代码经过类型检查,则无需提取这些常量并将它们导入各个模块。到处使用字符串字面量,类型系统会给你类型检查时的反馈,而不是等待使用常量的执行时反馈。
    猜你喜欢
    • 2016-06-15
    • 2021-09-29
    • 1970-01-01
    • 2018-05-19
    • 1970-01-01
    • 1970-01-01
    • 2012-07-30
    • 1970-01-01
    • 2011-02-15
    相关资源
    最近更新 更多