Значение подписи типа возврата метода createAction метода NgRx - PullRequest
1 голос
/ 04 ноября 2019

Я проходил процедуру NgRx Doumentation для метода createAction, как показано в ссылке ниже: Перегрузки для метода createAction

Я не могу понять нижеследующую сигнатуру этого метода, в частностиreturn Тип метода createAction: Что такое

() => TypedAction<T>

в этой подписи:

 ActionCreator<T, () => TypedAction<T>>

Я не вижу ссылки на TypedAction? Означает ли это какой-либо объект формы определенного типа Action?

Что я понимаю под T в приведенной выше сигнатуре возвращаемого типа, это то, что это универсальный тип для функции ActionCreator, которая будет возвращать Action типа T при вызове. Но не уверен, что другой аргумент типа указывает, за исключением того, что, похоже, это какая-то функция, которая возвращает TypedAction типа T. Хотелось бы узнать пример из реального мира.

1 Ответ

1 голос
/ 04 ноября 2019

TypedAction - это универсальный интерфейс, который расширяет тип Action путем добавления свойства type только для чтения.

export declare interface TypedAction<T extends string> extends Action {
  readonly type: T;
}

ActionCreator<T, () => TypedAction<T>> - сообщите нам, что у нас есть фабрика, которая возвращает объект TypedAction () => ({ type: T})

Давайте определим создателя действия:

export const logout = createAction('[Auth] Logout');

createAction функция определена в action_creator.ts.

export function createAction<T extends string>(
  type: T
): ActionCreator<T, () => TypedAction<T>>;

из объявления мы можем сказать, что createAction вернет функцию, которая в свою очередь возвращает объект со свойством type строки в нашем случае как <T extends string>

Давайте немного углубимся в реальную реализацию. Когда вы не предоставляете полезную нагрузку для создателя действия , выполняется следующий код :

export function createAction<T extends string, C extends Creator>(
  type: T,
  config?: { _as: 'props' } | C
): Creator {
...
    case 'empty':
      return defineType(type, () => ({ type }));
...
}

И defineType:

function defineType(type: string, creator: Creator): Creator {
  return Object.defineProperty(creator, 'type', {
    value: type,
    writable: false,
  });
}

defineType принимаеттип ('[Auth] Logout') и Создатель - () => ({ type }). Возвращает назад Создателя, но с новым свойством type. Таким образом, вызов logout.type и logout().type вернет одно и то же значение - '[Auth] Logout'

Позже, в reducer_creator.ts, это позволяет нам извлечь ActionCreator типа ("[Auth] Logout "в нашем случае), свяжите его с функцией редуктора и выполните его

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