使用 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 中的 <AppState>
替换为 <any>
,代码工作正常
有没有其他人遇到过类似的问题?我试图用谷歌搜索,但找不到任何重要的东西。
【问题讨论】:
【参考方案1】:您的错误消息表明属性 post 具有错误的方法签名。它是(state: State, action: Action) => void
,但应该是(state: State, action: Action) => 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, () => adapter.getInitialState())
当我应该包含额外的属性时
on(actions.resetState, () => adapter.getInitialState( foo: 'bar' ))
【讨论】:
以上是关于使用 ActionReducerMap 注册 reducer 时出错:“不可分配给 type 'ActionReducerMap<AppState, Action>”的主要内容,如果未能解决你的问题,请参考以下文章
如何在 getReducers():ActionReducerMap<fromFeature.State> 中返回 reducer 映射?