angular - Fehler beim Registrieren von Reducern mit ActionReducerMap: "nicht zuweisbar zum Typ 'ActionReducerMap<AppState, Action>"
Unten ist eine vereinfachte Version meiner Angular 5-Anwendung. Ich habe einen Reducer, den ich in meinem Root-Modul registrieren möchte. In LINE A erhalte ich folgenden Fehler:
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 : Stammmodul
imports: [
...
StoreModule.forRoot(reducers)
],
store/app.reducers.ts : innerhalb des Global Store
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 :im lokalen Speicher
export interface State{
query:string
posts:Post[]
}
const initialPostState: State = {
query:"initial",
posts:[]
};
export function postReducer(state = initialPostState, action:postActions.PostActions){}
Der Code funktioniert einwandfrei, wenn ich <AppState> in ZEILE A durch <any> ersetze. Hat sonst noch jemand ein ähnliches Problem gehabt? Ich habe versucht, danach zu googeln, aber konnte nichts Bedeutendes finden.
Antwort #1
Ihre Fehlermeldung besagt, dass die Eigenschaft post die falsche Methodensignatur hat. Sie ist (state: State, action: Action) => void, sollte aber (state: State, action: Action) => State sein.
In post.reducers.ts muss Ihr Reducer den Zustand zurückgeben, der ihm wie folgt übergeben wird:
export function postReducer(state = initialPostState, action:Action) {
return state;
};
Der Rückgabetyp wird implizit aus dem abgeleitet, was Sie zurückgeben, oder in diesem Fall nicht zurückgeben.
Sie könnten den Rückgabewert explizit mit ...): State {... angeben, aber Sie sollten dennoch den Zustand zurückgeben.
Antwort #2
Bitte gehe zu tsconfig.json und setze strict : false
