javascript - state.concat är inte en funktion - Typ 'ITask' är inte en array-typ


Jag försöker lägga till en array till min store, men får hela tiden följande fel vid tasks: payload.payload ? [ ...state, payload.payload ] : [], Error:(22, 35) TS2461: Type 'ITask' is not an array type. Hur åtgärdar jag det?

import * as TaskActions from './task.actions';
import { Action, createReducer, on } from '@ngrx/store';
import { ITask } from '../../models/task';

export interface State {
  task: ITask | null;
  error: any;
}

const initialState: ITask = {
  basketTotal: 0,
  carePlanPrice: 0,
  category: null,
  completionDate: null
};

export const taskReducer = createReducer(
  initialState,
  on(TaskActions.getData, state => ({ ...state })),
  on(TaskActions.dataReceived, (state, payload) => ({
    ...state,
    tasks: payload.payload ? [ ...state,  payload.payload ] : []
  })),
  on(TaskActions.dataNotReceived, state => ({ ...state })),
  on(TaskActions.signOut, state => ({ ...state })),
  on(TaskActions.signOutSuccess, state => ({ ...state, ...initialState })),
);

export function reducer(state: ITask | undefined, action: Action) {
  return taskReducer(state, action);
}

Skärmdump :

Svar #1

Task, payload är inte arrayer. Så det finns inget behov av att använda spread-operatorn.

tasks: payload.payload ? [ state,  payload.payload ] : []

MDN säger:

Spridningssyntax tillåter ett itererbart objekt såsom ett arrayuttryck eller en sträng att utvidgas på platser där noll eller fler argument (för funktionsanrop) eller element (för arrayliteral) förväntas, eller ett objektuttryck att utvidgas på platser där noll eller fler nyckel-värde-par (för objektliteral) förväntas.

Om du vill lägga till dem som objekt:

tasks: payload.payload ? [ { ...state}, {...payload.payload} ] : []

Svar #2

Du behöver ändra din kod så här

const initialState: State = {
  //set default initial state inside
};

Använder State-gränssnittet för initialState, inte ITask

Eftersom ditt gränssnitt bara har 2 egenskaper

task: ITask | null;
error: any;

Så ditt initialState kommer att vara

const initialState: State = {
  task: null,
  error: null
};

Och din reducerare

on(TaskActions.dataReceived, (state, payload) => ({
    ...state,
    task: payload.payload ? [ ...state,  payload.payload ] : []
  })),