使用 ActionReducerMap 注册 reducer 时出错:“不可分配给 type 'ActionReducerMap<AppState, Action>”

Posted

技术标签:

【中文标题】使用 ActionReducerMap 注册 reducer 时出错:“不可分配给 type \'ActionReducerMap<AppState, Action>”【英文标题】:Getting error while registering reducers using ActionReducerMap: "not assignable to type 'ActionReducerMap<AppState, Action>"使用 ActionReducerMap 注册 reducer 时出错:“不可分配给 type 'ActionReducerMap<AppState, Action>” 【发布时间】:2018-07-20 06:07:34 【问题描述】:

以下是我的 Angular 5 应用程序的简化版本。我有一个减速器,我想在我的根模块中注册它。在 LINE A 我收到以下错误:

ERROR in src/app/store/app.reducers.ts(7,14): error TS2322: Type ' post: (state: State, action: Action) => void; ' is not assignable to type 'ActionReducerMap<AppState, Action>'.
  Types of property 'post' are incompatible.
    Type '(state: State, action: Action) => void' is not assignable to type 'ActionReducer<State, Action>'.
      Type 'void' is not assignable to type 'State'.

app.module.ts:根模块

  imports: [
    ...
    StoreModule.forRoot(reducers)
  ],

store/app.reducers.ts:在全球商店内

import ActionReducerMap from "@ngrx/store";
import * as fromPost from "../postDir/store/post.reducers";

export interface AppState 
  post:fromPost.State

export const reducers: ActionReducerMap<AppState> =  //=======LINE A ======
  post:fromPost.postReducer
;

postDir/store/post.reducers.ts:本地商店内

export interface State
  query:string
  posts:Post[]


const initialPostState: State = 
  query:"initial",
  posts:[]
;

export function postReducer(state = initialPostState, action:postActions.PostActions)

如果我将 LINE A 中的 &lt;AppState&gt; 替换为 &lt;any&gt;,代码工作正常 有没有其他人遇到过类似的问题?我试图用谷歌搜索,但找不到任何重要的东西。

【问题讨论】:

【参考方案1】:

您的错误消息表明属性 post 具有错误的方法签名。它是(state: State, action: Action) =&gt; void,但应该是(state: State, action: Action) =&gt; State

post.reducers.ts 中,你的 reducer 需要像这样返回传递给它的状态:

export function postReducer(state = initialPostState, action:Action)  
  return state;
;

返回类型是从你是什么隐式推断出来的,或者在这种情况下不是,返回。

您可以使用...): State ... 显式声明返回类型,但仍应返回该状态。

【讨论】:

@bygrace 感谢您的回复,但它确实在我的真实代码中返回了状态 obj。我已经省略了这个和许多其他代码以使这个问题最小化。 @SKG 可以显示postReducer 代码吗?您是否尝试过明确说明其返回类型?该错误意味着编译器认为postReducer 没有返回任何内容。 我发现 postReducer 返回了不兼容的类型。类似:return [x] 而不是 return [...x]【参考方案2】:

请转到 tsconfig.json 并执行严格:false

【讨论】:

您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center。 谢谢,这对我有用。【参考方案3】:

我遇到了类似的情况,经过很长时间,检查我的代码,我发现 reducer 的 switch case 操作中缺少属性返回。 确保使用扩展运算符...state 加载之前的状态,这样可以避免很多难以找到的问题。就我而言,我返回了所有属性,但没有先加载前一个状态。得到 TS2322 错误并花费数小时修复并了解发生了什么。 以你的代码为例:

export function postReducer(state = initialPostState, action:postActions.PostActions)

// here you must return the state after an action
   switch (action.type)
       case postActions.ACTION_EXAMPLE:
       return 
              ...state, someProperty: action.payload  // here you load your previous state and change just that one you want

      
      case postActions.ACTION_02_EXAMPLE:
      return 
              ...state, someProperty: action.payload  // here you load your previous state and change just that one you want

      
     default:
     return  ...state
    

希望对你有帮助!

【讨论】:

在默认情况下,为什么不用return state; 来代替?【参考方案4】:

如果有人偶然发现我犯的同样错误,请回答。当我想将状态重置为特定操作的初始状态时,我使用 @ngrx/entity 遇到了这个问题,我有:

on(actions.resetState, () =&gt; adapter.getInitialState())

当我应该包含额外的属性时

on(actions.resetState, () =&gt; adapter.getInitialState( foo: 'bar' ))

【讨论】:

以上是关于使用 ActionReducerMap 注册 reducer 时出错:“不可分配给 type 'ActionReducerMap<AppState, Action>”的主要内容,如果未能解决你的问题,请参考以下文章

如何在 getReducers():ActionReducerMap<fromFeature.State> 中返回 reducer 映射?

将大减速器拆分为较小的减速器

BUUCTF-RE-简单注册器

RE-1 逆向分析基础

re模块

6.使用Go向Consul注册的基本方法