Решено: Если вы столкнетесь с этой проблемой точно, не делайте ошибку с моей головой. Я пытался деконструировать объект в Object.assign
, когда я должен был просто передать объект. @ Эльдар и @ Akxe были достаточно любезны, чтобы взглянуть на код fre sh и помочь мне увидеть мою ошибку в комментариях.
Проблема: Я пытаюсь создать повторно используемую сущность для своих редукционных действий в машинописи, чтобы я мог просто передать тип в редукторе, но он жалуется, что мой тип не повторяется, и я не уверен, как это сделать. решить это. Я слепо пытался добавить typeof
и Iterable
безрезультатно, поэтому я ищу небольшую помощь и объяснение.
У меня есть Entity для моего пользователя:
export default interface UserEntity {
uid: string | null;
firstName: string | null;
}
и создал универсальный c объект для моего действия как:
export default interface StoreAction<T> {
payload: T;
type: string;
}
В моем редукторе я надеялся реализовать его следующим образом:
const initialState: UserEntity = {
uid: null,
firstName: null,
};
export default (state = initialState, action: StoreAction<UserEntity>) => {
switch (action.type) {
case 'Some string':
return Object.assign({}, state, ...action.payload); // Warning that action.payload is not iterable
default:
return state;
}
};
, но VS Code is жаловаться Type 'UserEntity' must have a '[Symbol.iterator]()' method that returns an iterator.
Хотя я понимаю, на что оно жалуется, я не знаю, как его решить.
Если здесь не очевидно, я хочу передать своему действию полезную нагрузку json в структура этого UserEntity
, а затем иметь возможность использовать оператор распространения, чтобы объединить его с моим состоянием избыточности. И я надеялся сделать это обобщенным c, потому что некоторые действия будут иметь массивы, некоторые могут быть просто булевыми и т. Д. c. Сайт редукса дает аналогичные примеры, показывающие операторы спреда с интерфейсами , как будто это должно работать, но я явно что-то упускаю в моем.
Edit : Добавление моего tsconfig . json:
{
"compilerOptions": {
"target": "esnext",
"module": "commonjs",
"lib": [
"es6"
],
"allowJs": true,
"jsx": "react-native",
"noEmit": true,
"isolatedModules": true,
"strict": true,
"moduleResolution": "node",
"baseUrl": "./",
"allowSyntheticDefaultImports": true,
"esModuleInterop": true
},
"exclude": [
"node_modules",
"babel.config.js",
"metro.config.js",
"jest.config.js"
]
}