Отмена обновления setState приводит к ошибке назначения типа - PullRequest
0 голосов
/ 27 марта 2020

У меня есть пользовательская ловушка React для моих компонентов с более сложным состоянием. По сути, это обычный хук useState, но с двумя дополнительными функциями: он проверяет равенство и предотвращает повторный рендеринг, а также объединяет состояние вместо его замены. Мне нужно вернуть null из setState, чтобы отменить обновление состояния, но TypeScript не позволяет мне. Я получаю следующую ошибку:

Argument of type '(prevState: K) => (K & Partial<K>) | null' is not 
assignable to parameter of type 'SetStateAction<K>'.
  Type '(prevState: K) => (K & Partial<K>) | null' is not 
  assignable to type '(prevState: K) => K'.
    Type '(K & Partial<K>) | null' is not assignable to type 'K'.
      Type 'null' is not assignable to type 'K'.ts(2345)

Мой хук выглядит так:

export function useNestedState<K extends UnknownObject>( // UnknownObject = {[key: string]: any}
  initialState: K,
): [K, (newState: Partial<K>) => void] {
  const [state, setState] = useState<K>(initialState);

  const setNestedState = useCallback((newState: Partial<K>) => {
    setState((prevState) => {
      return comparePartialObject(prevState, newState) // Returns `true` if equal
        ? null // Will cancel state update
        : { ...prevState, ...newState };
    });
  }, []);

  return [state, setNestedState];
}

Может кто-нибудь помочь мне решить эту ошибку?

1 Ответ

0 голосов
/ 27 марта 2020

Когда comparePartialObject получает значение true, вы не отменяете обновление состояния, вместо этого вы обновляете состояние с нулевым значением. Поскольку состояние имеет тип «K», оно выдает ошибку, из-за которого нельзя установить состояние типа «K» на ноль. Этот код будет работать

setState((prevState) => {
      return comparePartialObject(prevState, newState) // Returns `true` if equal
        ? prevState // Will not change the old state
        : { ...prevState, ...newState };
    });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...