为啥声明类型时可以在 redux 中未定义状态?

Posted

技术标签:

【中文标题】为啥声明类型时可以在 redux 中未定义状态?【英文标题】: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。为什么状态可以是未定义的?如果未定义是合理的,我应该如何更改我的代码以消除错误消息?

【问题讨论】:

【参考方案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,
  ;
;

【讨论】:

以上是关于为啥声明类型时可以在 redux 中未定义状态?的主要内容,如果未能解决你的问题,请参考以下文章

在 mapStateToProps 中未定义 Redux 状态

为啥使用 redux devtools 在我的 _reduxDevtools 对象中未定义 ActionCreators 属性?

为啥redux中状态未定义

reducer.state.props 在嵌套动作 react/redux 中未定义

Redux - 调度在行动中未定义

为啥我的 Redux reducer 认为我的状态是未定义的?