В моих редукторах я хочу получить доступ к свойству полезной нагрузки для обновления хранилища, но 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 меня. Разве машинописный текст в любом случае не должен выводить полезную нагрузку из-за того, что типы действий объединены с оператором объединения?