У меня есть:
export type DataItemChild = {
id: number;
title:string;
checked?: boolean;
};
Обратите внимание, что подэлементы здесь могут быть неопределенными:
export type DataItems = {
id: number;
title:string;
subItems?: Array<DataItemChild>;
checked?: boolean;
};
export const initalState: StateType = {
items: [],
date: new Date(),
};
До сих пор я выяснил, как обновить массив на объекте верхнего уровня, например:
case ActionKind.Checked:
newArrayChecked = state.items.map((item) => ({
...item,
checked: item.id === payload.id ? true : item.checked,
}));
return {
...state,
items: newArrayChecked,
};
Не могу понять, как обновить подпункты? у меня есть это (урезанное)
export const reducer = (state: StateType, action: Action) => {
const { type, payload } = action;
let newArrayChildCheck: Array<DataItemChild> = []
switch (type) {
case ActionKind.UnCheckedSub:
newArrayChildCheck = state.items.map((item) => ({
...item.subItems?.map((sub, index) => ({
checked: sub.id === payload.subItems?[index].id ? true: sub.checked
})),
}));
return {
...state,
items.subItems: newArrayChildCheck,
};
default:
return state;
}
};
Но это дает мне типическую ошибку, говорящую о том, что мой newArrayChildCheck не поддерживает undefined. Полная ошибка:
Введите '{ [x: число]: { проверено: логическое значение | неопределенный; }; длина?: номер | неопределенный; toString?: (() => строка) | неопределенный; toLocaleString?: (() => строка) | неопределенный; поп?: (() => { проверено: логический | неопределенный; } | не определено) | неопределенный; ...еще 29...; [Symbol.unscopables]?: (() => { ...; }) | неопределенный; }[]' не является назначаемый для типа «DataItemChild []». Введите '{ [x: число]: { проверено: логическое значение | неопределенный; }; длина?: число | неопределенный; toString?: (() => строка) | неопределенный; toLocaleString?: (() => строка) | неопределенный; поп?: (() =
РЕДАКТИРОВАТЬ:
после ответа @Kelvin Schoofs я понял, что отправляю целый объект, который имеет свои подэлементы. полезная нагрузка имеет тип DataItems
Я изменил свою попытку в соответствии с предложением @Kelvin Schoofs с небольшим изменением:
newArrayChildCheck = state.items.map((item) => ({
...item,
subItems: item.subItems?.map((sub, index) => ({
...sub,
checked: sub.id === payload.subItems[index].id ? true : sub.checked
})),
Не [index]
Но я получаю
объект возможно не определен
хм, вы, кажется, что-то здесь. Я немного обновляю вопрос, так как понял, что отправляю весь объект, поэтому мне нужно проверить, есть ли в объекте полезной нагрузки подэлементы, а затем найти подэлемент в состоянии и обновить его: newArrayChildCheck = state.items.map((item) = > ({ ...item, subItems: item.subItems?.map((sub, index) => ({ ...sub, checked: sub.id === payload.subItems[index]?.id ? true : sub.checked })), но не могу заставить его работать.
Я добавил редактирование в вопрос
Я не знаю, что такое
payload.subItems
, но, видимо, это может бытьundefined
. Кроме того, если вы индексируете, используяindex
, это просто число, вам нужно убедиться, что вашиitem.subItems
иpayload.subItems
имеют одинаковые элементы в том же порядке.Хорошо, это заставило меня понять, что моя структура немного неверна. Приму ответ, так как он дал мне разрешение. Спасибо!