Отсутствует аннотация типа для параметра типа, объявленного в типе функции, который неявно был создан при вызове combReducers - PullRequest
0 голосов
/ 28 января 2019

Сейчас я получаю следующую ошибку на combReducers в Redux.

Отсутствует аннотация типа для A.A - это параметр типа, объявленный в типе функции [1] и неявно созданный при вызове combineReducers [2].

Код выглядит следующим образом, но встречается во всех моих редукторах, которые используютcombReducers.

export default combineReducers({
  status: ((state: boolean = true, action: Action) => {
    switch (action.type) {
      case 'START_SESSION':
      case 'REFRESH_AUTH_SUCCEEDED':
      case 'SIGN_IN_FAILED':
      case 'SIGN_OUT':
        return false;
      default:
        return state;
    }
  }: Reducer<*>),
});

Я полагаю, что это из-за определения этого типа в типах потока Redux


declare export function combineReducers<O: Object, A>(reducers: O): 
       CombinedReducer<$ObjMap<O, <S>(r: Reducer<S, any>) => S>, A>;

Я полагаю, что это связано с выпуском Flow версии 0.85.0, который представил кое-что, касающееся «неявных реализаций».

Я прочитал эту статью о Средстве от Сэма Голдмана из FLOW, и именно так я пришел к такому выводу.https://medium.com/flow-type/asking-for-required-annotations-64d4f9c1edf8

Мне удалось устранить ошибку, выполнив следующее, что является моей попыткой реализовать что-то вроде упоминания статей о решении «предоставление явного аргумента типа для вызова функции».

export default combineReducers<Object, Action>({
  status: ((state: boolean = true, action: Action) => {
    switch (action.type) {
      case 'START_SESSION':
      case 'REFRESH_AUTH_SUCCEEDED':
      case 'SIGN_IN_FAILED':
      case 'SIGN_OUT':
        return false;
      default:
        return state;
    }
  }: Reducer<*>),
});

Я сделал это, потому что увидел, что определение функции в документации Redux было

combineReducers<O: Object, A>

Но я не до конца понимаю, почему это работает, или знаю, действительно ли это правильное решение илинет смысла и мне просто повезло.Я пытался найти в Google НЕПРАВИЛЬНЫЕ УСТАНОВКИ, но ничего не нашел.Я готов эту статью, но до сих пор не знаю точно, какой тип возврата вызова должен быть аннотирован на основе

combineReducers<O: Object, A>

1 Ответ

0 голосов
/ 10 июля 2019

TL; DR

Замените Object на свой объект, где ключи - ваши ключи состояния, а значения - ваше определение редуктора: {status: Reducer<boolean, Action>}

таким образом, вы получите:

combineReducers<{status: Reducer<boolean, Action>}, Action>(...)

Длинный ответ.

Reducer<S, any> - редуктор - это чистая функция, которая принимает текущее состояние идействие и возвращает новое состояние.Вот и все, довольно просто.И таким образом это точно описано в flow-type :

declare export type Reducer<S, A> = (state: S | void, action: A) => S

$ObjMap<O, <S>(r: Reducer<S, any>) => S> - это более сложно, отобразить данный объект O, вызватькаждый член (мы ожидаем, что они будут функциями) и возвращают тип.Проверьте документ , это очень мощная вещь.

Эта часть: <S>(r: Reducer<S, any>) => S может называться extract function type.В человеческих словах это можно сказать как -> редуктор может вернуть любой тип, верно?Итак, давайте поместим возвращенное состояние редуктора в общий <S>, а затем поместим возвращаемый тип в этот универсальный .Мне потребовалось более 1 дня, чтобы понять, как это работает, надеюсь, в вашем случае это будет быстрее.:)

Итак, наконец: combineReducer<S, A> - заданное состояние S (которое является Object, и каждый член является редуктором), и действие A возвращает объект, члены которого приводятся типом для каждого вызова члена S.

Итак, ваша status функция редуктора - может быть лучше описана как

Reducer<boolean, Action> //accepts boolean, Action args & return boolean

И мы можем определить состояние как:

type State = { status: Reducer<boolean, Action> };

А затем, передайте состояние для combReducer:

export default combineReducers<State, Action>({
    status: ((state: boolean = true, action: Action) => {
        switch (action.type) {
        case 'START_SESSION':
        case 'REFRESH_AUTH_SUCCEEDED':
        case 'SIGN_IN_FAILED':
        case 'SIGN_OUT':
            return false;
        default:
            return state;
        }
    }),
});

Чтобы проверить правильность ввода, вы можете импортировать ваш редуктор и привести выражения :

const checkState = reducer({status: true}, {type: 'START_SESSION'});
(checkState.status: number); // ERROR
(checkState.status: boolean); // CORRECT

Надеюсь, это поможет.

...