Typescript Redux Action Generi c с повторяемым типом - PullRequest
0 голосов
/ 10 апреля 2020

Решено: Если вы столкнетесь с этой проблемой точно, не делайте ошибку с моей головой. Я пытался деконструировать объект в 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"
  ]
}

1 Ответ

1 голос
/ 10 апреля 2020

Object.assign({}, state, ...action.payload) фактически неверный синтаксис. У вас есть два варианта, как это исправить.

Либо передайте объект в Object.assign как есть: return Object.assign({}, state, action.payload)

, либо используйте деконструкцию, так как она делает то же самое но может предложить лучшую производительность (для некоторых двигателей) return { ...state, ...action.payload }.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...