将类型正确传递给 Redux reducer

Passing in types properly to Redux reducer

我在使用 Typescript 的 Redux 的 reducer 函数中尝试将正确的类型传递给我的操作 属性 时遇到了一些困难。在常规的 es6 语法中,我会传入这样的类型:

action: {}

但是在 Typescript 中是针对更具体的操作类型,所以我尝试了这样的操作:

import {
  UPDATE_STATE,
} from '../constants/ActionTypes';

import * as Actions from '../actions/index.js';

const initialState = {
  someState: '',
}

// TODO: Type checking here is throwing an error

export default function counter(state = initialState, action : Actions ) {
  switch(action.type) {
    case UPDATE_STATE:
      return {
        ...state,
      }
    }
}

当我尝试在 Webpack 中编译时,Typescript 当前抛出此错误:

ERROR in [at-loader] ./src/reducers/numberpad.tsx:27:64 TS2304: Cannot find name 'Actions'.

操作:

index.js
import * as types from '../constants/ActionTypes'

export function update(val) {
  return { type: types.UPDATE, val }
}

常量:

export const UPDATE = 'UPDATE'

到目前为止我不知所措,我也尝试过将类型作为 "object" 传递(因为从我的操作中返回的是一个实际对象)但是,这似乎并没有得到认了。我也试过指定一种 "any" 来让它更灵活,但 TS 似乎也不喜欢那样。

对于 TS 在这些情况下检查的内容,我有点困惑。欢迎任何想法。谢谢。

您的操作应该是接口或类型。

您的导入是从 index.js 文件导入所有内容并将其命名为 "Actions"。

在您的 index.js 文件中,您需要声明一个类型或接口,例如

export interface IAction {
    type: string;
    data: any;
}

然后在你的reducer中,你需要:

import {IAction} from '../actions/index.js';

...然后是你的减速器:

export default function counter(state = initialState, action : IAction) {
  switch(action.type) {
    case UPDATE_STATE:
      return {
        ...state,
      }
    }
}