【问题标题】:Why the state can be undefined in redux when its type is declared?为什么声明类型时可以在 redux 中未定义状态?
【发布时间】:2020-04-10 01:21:11
【问题描述】:

我正在使用 dva.js(基于 redux)在我的 react 应用程序中进行状态管理。我定义了一个减速器如下:

import { Reducer } from 'redux';

interface StateType {
  a: any;
  b: any;
}

const setState: Reducer<StateType> = (state, { payload }) => {
  return {
    ...state,
    b: payload,
  };
};

tslint 会告诉我类型 '{ a: any; 中缺少属性 'a' b:任何; }' 但在“StateType”类型中是必需的。于是查看了redux的d.ts文件,找到了reducer的类型声明:

export type Reducer<S = any, A extends Action = AnyAction> = (
  state: S | undefined,
  action: A
) => S

显然tslint考虑reducer的第一个参数state是可以undefined的,所以不能确定reducer的返回值类型是StateType。为什么状态可以是未定义的?如果未定义是合理的,我应该如何更改我的代码以消除错误消息?

【问题讨论】:

    标签: typescript redux typescript-typings


    【解决方案1】:

    目前你的reducer的state参数没有类型,所以默认state类型是any。您需要指定类型以将其声明为始终定义。

    const setState: Reducer<StateType> = (state: StateType, { payload }) => {
      ...
    };
    

    【讨论】:

    • 感谢您的回答。我试过了,tslint 告诉我输入 'StateType | undefined' 不能分配给 'StateType'。我认为Reducer&lt;StateType&gt; 已将state 参数的类型指定为StateType | undefined
    【解决方案2】:

    感谢dancerphil的建议。他提供了如下解决方案:

    import { Reducer } from 'redux';
    
    interface StateType {
      a: any;
      b: any;
    }
    
    const INITIAL_STATE = { a: {}, b: {} };
    
    const setState: Reducer<StateType> = (state = INITIAL_STATE, { payload }) => {
      return {
        ...state,
        b: payload,
      };
    };
    

    【讨论】:

      猜你喜欢
      • 2021-12-16
      • 2014-05-07
      • 1970-01-01
      • 1970-01-01
      • 2017-04-30
      • 2016-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多