',angular,typescript,rxjs,ngrx,angular8"/>

首页 > 解决方案 > BaseRouterStoreState 缺少“ActionReducerMap”类型的属性'

问题描述

我不断收到以下错误:

错误:(11, 18) TS2739: Type '{ router: (state: RouterReducerState, action: Action) => RouterReducerState; }' 缺少“ActionReducerMap”类型的以下属性:用户,错误

我看过这样的例子:https ://github.com/starjumper30/toh-ngrx8/blob/3a8d61d8423af8543de8a30aed16ee941ffcea0b/src/app/reducers/index.ts似乎以类似的方式设置并且工作正常。

这是我的代码:

import { Action, ActionReducer, ActionReducerMap, MetaReducer } from '@ngrx/store';
import { State } from '../modules/auth/auth.reducer';
import { environment } from '../../environments/environment';
import * as fromRouter from "@ngrx/router-store";
import { InjectionToken } from '@angular/core';

export interface State {
  router: fromRouter.RouterReducerState<any>;
}
export const ROOT_REDUCERS = new InjectionToken<ActionReducerMap<State, Action>>('Root reducers token', {
  factory: () => ({
    router: fromRouter.routerReducer
  })
});

export function logger(reducer: ActionReducer<State>): ActionReducer<State> {
  return (state: State, action: any): any => {
    const result = reducer(state, action);
    console.groupCollapsed(action.type);
    console.log('prev state', state);
    console.log('action', action);
    console.log('next state', result);
    console.groupEnd();
    return result;
  };
}

export const metaReducers: MetaReducer<State>[] = !environment.production
  ? [logger]
  : [];

此错误的原因是什么,我该如何解决?

标签: angulartypescriptrxjsngrxangular8

解决方案


我认为你在这一行有错误

import { State } from '../modules/auth/auth.reducer';

所以你可以删除它,因为你的文件中已经定义了一个 State 接口状态

我也在这里不使用State

return (state: State, action: any): any => { // remove State here

我的完整工作代码将是这样的

import {
  ActionReducer,
  ActionReducerMap,
  MetaReducer,
  Action
} from "@ngrx/store";
import { environment } from "../../../environments/environment";
import * as fromRouter from "@ngrx/router-store";
import { InjectionToken } from "@angular/core";

export interface State {
  router: fromRouter.RouterReducerState<any>;
}

export const ROOT_REDUCERS = new InjectionToken<
  ActionReducerMap<State, Action>
>("Root reducers token", {
  factory: () => ({
    router: fromRouter.routerReducer
  })
});

export function logger(reducer: ActionReducer<State>): ActionReducer<State> {
  return (state, action) => {
    const result = reducer(state, action);
    console.groupCollapsed(action.type);
    console.log("prev state", state);
    console.log("action", action);
    console.log("next state", result);
    console.groupEnd();

    return result;
  };
}

export const metaReducers: MetaReducer<State>[] = !environment.production
  ? [logger]
  : [];

推荐阅读