Сбой Redux-thunk типа ThunkDispatch при передаче интерфейса в `dispatch <ShowSnackbar>({})` - PullRequest
0 голосов
/ 16 декабря 2018

При применении интерфейса к функции dispatch() моего редукционного thunk, проверка ошибок кажется неправильной.Например, если я закомментирую свойство, Typescript жалуется на то, что оно действительно включено, говоря, что оно отсутствует:

...

type ThunkResult<R> = ThunkAction<R, RootState, undefined, Action>;

export interface ShowSnackbar {
  type: string,
  isOpened: boolean
}

export const showSnackbar = (): ThunkResult<void> => (dispatch, getState) => {

    dispatch<ShowSnackbar>({
        // type: 'baz',
        isOpened: true // <-- 'isOpened' does not exist in type 'ThunkAction<ShowSnackbar ...
    });

}

После проверки типа ThunkDispatch redux-thunk я заметил, что первое объявление функцииперегруженные функции игнорируются, и вторая, которая ожидает, что функция была вызвана, когда мое действие имеет закомментированное свойство (преднамеренно введенная ошибка):

export interface ThunkDispatch<S, E, A extends Action> {
  <T extends A>(action: T): T;
  <R>(asyncAction: ThunkAction<R, S, E, A>): R;
}

Если, скажем, я удаляю <R>(asyncAction: ThunkAction<R, S, E, A>): R;, проверка типа возвращается кнормальный, и TS предупредит меня правильно:

'тип' отсутствует в типе '{isOpened: true;} 'но требуется в типе' ShowSnackbar '.

Я собрал демо на TS Playground , которое демонстрирует проблему.

Или я делаючто-то не так?

Спасибо!

1 Ответ

0 голосов
/ 17 декабря 2018

TypeScript здесь запутался, поскольку у него есть две возможности попробовать.Если вы измените порядок ThunkDispatch, вы уже получите сообщение об ошибке, которое хотите увидеть в первую очередь:

export interface ThunkDispatch<S, E, A extends Action> {
  <R>(asyncAction: ThunkAction<R, S, E, A>): R;
  <T extends A>(action: T): T;
}

Аргумент типа '{isOpened: true;} 'нельзя назначить параметру типа' ShowSnackbar '.Свойство 'type' отсутствует в типе '{isOpened: true;} 'но требуется в типе' ShowSnackbar '.

В качестве отступления: я бы предложил добавить extends Action<string> (или Action<'baz'>) к вашему ShowSnackbar интерфейсу и удалить type: string изего определение.Таким образом, вы будете оставаться Action, даже если позже вы решите что-то изменить в действии.Или, по крайней мере, вы получите сообщения об ошибках, когда решите сменить имя type на что-то другое, например.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...