Как мне express, чтобы S имел свойство "грязный" типа boolean? - PullRequest
1 голос
/ 10 февраля 2020

Я пытался задать это ранее в общем ( Почему я не могу присвоить 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) в строке с закомментированным приведением.

Ответы [ 2 ]

0 голосов
/ 20 февраля 2020

вы делаете S extends { dirty: boolean } правильно. просто замените Partial<S> на S, исправьте, как объяснено SquattingSlavInTracksuit .

0 голосов
/ 13 февраля 2020

Когда вы объявляете S extends { dirty: boolean }, вы делаете именно то, что просите в вопросе - вы объявляете тип S, который должен иметь свойство dirty.

Когда вы объявляете тип Partial<S>, вы говорите, что все свойства S являются необязательными. Поэтому даже свойство dirty имеет вид.

Просто избавиться от пристрастия S в updateAction, как updateAction: ActionCreatorWithPreparedPayload<[Arg, S], P>, и это должно решить ваши проблемы ?

...