Я пытался задать это ранее в общем ( Почему я не могу присвоить U частичному , когда T расширяет U? ), и теперь я понимаю, почему S extends {dirty: boolean}
неверно ( S может быть {dirty: false}
, но большинство предложений заключалось в том, чтобы переписать функцию каким-либо образом. Итак, как мне переписать эту функцию, чтобы она имела надлежащую проверку типа и не требовала преобразования?
import {ActionCreatorWithPreparedPayload} from '@reduxjs/toolkit';
import {assert, pick} from '@helpmedo/util';
import {State, ThunkAction} from '@helpmedo/state';
export const createAsyncUpdateAction = <Arg, S extends {dirty: boolean}, P>(
updateAction: ActionCreatorWithPreparedPayload<[Arg, Partial<S>], P>,
selector: (state: State, arg: Arg) => S,
) => (
arg: Arg,
update: Partial<S>,
asyncUpdate: () => Promise<unknown>,
): ThunkAction<unknown> => async (dispatch, getState) => {
const state = selector(getState(), arg);
assert(!state.dirty, 'Attempt to modify dirty state');
const save = pick(state, Object.keys(update));
dispatch(updateAction(arg, {...update, dirty: true}));
try {
const result = await asyncUpdate();
dispatch(updateAction(arg, {dirty: false} /* as Partial<S> */));
return result;
} catch (err) {
dispatch(updateAction(arg, {...save, dirty: false}));
throw err;
}
};
Существующая ошибка Argument of type '{ dirty: false; }' is not assignable to parameter of type 'Partial<S>'.ts(2345)
в строке с закомментированным приведением.