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 "в нашем случае), свяжите его с функцией редуктора и выполните его