Понимание обобщенных типов и типов Redux Thunk - PullRequest
0 голосов
/ 30 апреля 2020

Я немного озадачен синтаксисом Redux Thunk в Typescript. Я довольно новичок в Typescript, но у меня все нормально, но есть особая часть, которую я не понимаю.

Вот файл определения типа для redux-thunk:

import { Middleware, Action, AnyAction } from "redux";

export interface ThunkDispatch<S, E, A extends Action> {
  <T extends A>(action: T): T; // I don't understand this line
  <R>(asyncAction: ThunkAction<R, S, E, A>): R; // or this line
}

export type ThunkAction<R, S, E, A extends Action> = (
  dispatch: ThunkDispatch<S, E, A>,
  getState: () => S,
  extraArgument: E
) => R;

export type ThunkMiddleware<S = {}, A extends Action = AnyAction, E = undefined> = Middleware<ThunkDispatch<S, E, A>, S, ThunkDispatch<S, E, A>>;

declare const thunk: ThunkMiddleware & {
  withExtraArgument<E>(extraArgument: E): ThunkMiddleware<{}, AnyAction, E>
}

export default thunk;

Часть, с которой я смущен:

<T extends A>(action: T): T; // I don't understand this line
<R>(asyncAction: ThunkAction<R, S, E, A>): R; // or this line

Я смотрел на документация, и это показывает это:

interface GenericIdentityFn<T> {
    (arg: T): T;
}

function identity<T>(arg: T): T {
    return arg;
}

let myIdentity: GenericIdentityFn<number> = identity;

Значит ли это, что ThunkDispatch является функцией и может следовать любой из этих двух сигнатур функций?

Я могу видеть из Thunk Action, эта отправка всегда будет ThunkDispatch, но я не могу разобрать интерфейс ThunkDispatch.

Было бы фантастически c, если бы кто-то мог объяснить это для меня.

Большое спасибо.

1 Ответ

0 голосов
/ 30 апреля 2020

По умолчанию store.dispatch(action) возвращает отправленный объект действия.

Строка <T extends A>(action: T): T; описывает это поведение:

  • Мы отправляем объект действия и тип объект T
  • Возвращаемое значение отправки - тот же объект

Аналогично, для <R>(asyncAction: ThunkAction<R, S, E, A>): R:

  • R параметр generi c для типа возврата конкретного блока
  • Когда мы отправляем этот блок, dispatch(thunk()) возвращает результат блока

И да, этот синтаксис говоря, что ThunkDispatch - это функция с двумя разными перегрузками.

...