Невозможно получить доступ к свойствам полезной нагрузки в редукторах при отправке действий с использованием response-redux и typescript - PullRequest
0 голосов
/ 10 июля 2020

В моих редукторах я хочу получить доступ к свойству полезной нагрузки для обновления хранилища, но Typescript, похоже, жалуется на тип свойства, к которому я хочу получить доступ.

// _ constants.ts

export const resultsConstants = {
  STORE_RESULT: "STORE_RESULT",
  DELETE_RESULT: "DELETE_RESULT",
};

// _ actiontypes.ts

import { resultsConstants } from "../../_constants";

export interface StoreResult {
  type: typeof resultsConstants.STORE_RESULT;
  payload: { value: number };
}

export interface DeleteResult {
  type: typeof resultsConstants.DELETE_RESULT;
  payload: {
    id: string;
  };
}

// отправка results.actions.ts

export const storeResult = (val: number) => {
  return (dispatch: Dispatch<StoreResult>) => {
    dispatch({
      type: resultsConstants.STORE_RESULT,
      payload: { value: val },
    });
  };
};

export const deleteResult = (id: string) => {
  return (dispatch: Dispatch<DeleteResult>) => {
    dispatch({ type: resultsConstants.DELETE_RESULT, payload: { id: id } });
  };
};

export type ResultActionTypes = StoreResult | DeleteResult;

// reducer.ts

const initialState: StoredResults = {
  results: [],
};

export const results = (
  state = initialState,
  action: ResultActionTypes
): StoredResults => {
  switch (action.type) {
    case resultsConstants.DELETE_RESULT:
      return state;
    case resultsConstants.STORE_RESULT:
      const oldState = { ...state };
      oldState.results = state.results.concat(action.payload.value); /* cannot access this value here */
      return { ...state };
    default:
      return state;
  }
};

Это ошибка, которую я получаю от TS:

Property 'value' does not exist on type '{ value: number; } | { id: string; }'.
  Property 'value' does not exist on type '{ id: string; }'.ts(2339)

Несмотря на то, что я объединил типы действий в файлах results.actions.ts, он жалуется, что свойство value не существует для типа действия, который является передается функцией отправки.

Любая помощь или совет о том, как это сделать по-другому, были бы очень признательны!

Спасибо!

EDIT

Путем дальнейшего разделения интерфейсов типов действий на интерфейс полезной нагрузки и приведения типа полезной нагрузки в редукторе я получил это, чтобы работать:

// results.types.ts

export interface StoreResultPayload {
  value: number;
}

export interface StoreResultType {
  type: typeof resultsConstants.STORE_RESULT;
  payload: StoreResultPayload;
}

// results.reducer.ts

const val = action.payload as StoreResultPayload;
oldState.results = state.results.concat(val.value);

Это все еще похоже на обходной путь. r меня. Разве машинописный текст в любом случае не должен выводить полезную нагрузку из-за того, что типы действий объединены с оператором объединения?

Ответы [ 2 ]

1 голос
/ 10 июля 2020

Попробуйте и посмотрите, работает ли

interface StorePayload {
  value: number;
}

interface DeletePayload {
  value: string;
}

export interface StoreResult {
  type: string;
  payload: StorePayload
}

export interface DeleteResult {
  type: string;
  payload: DeletePayload;
}
0 голосов
/ 11 июля 2020

Приведение типа объекта полезной нагрузки (чтобы сказать Typescript: «Поверьте мне, я знаю, что я делаю») - это единственный обходной путь, который я пока мог найти. См. Отредактированный вариант вопроса для ответа.

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