redux-toolkit-saga
Version:
Redux Toolkit Saga
56 lines • 2.82 kB
TypeScript
import { Action, AnyAction } from 'redux';
import { PayloadAction, PayloadActionCreator, ActionCreatorWithoutPayload, ActionCreatorWithPreparedPayload } from '@reduxjs/toolkit';
import { CallEffect, AllEffect } from 'redux-saga/effects';
import { SagaIterator } from 'redux-saga';
export declare enum SagaType {
Watch = 0,
Normal = 1,
TakeLatest = 2,
TakeEvery = 3
}
export declare type CaseSagas<A extends Action = AnyAction> = (action: A) => Generator<unknown, unknown, SagaIterator>;
declare type CustomCaseSaga = {
fn: CaseSagas<PayloadAction<any>>;
sagaType?: SagaType;
};
export declare type SliceCaseSagas = {
[K: string]: CaseSagas<PayloadAction<any>> | CustomCaseSaga;
};
declare type ActionCreatorForCaseSagaWithPrepare<CR extends {
prepare: any;
}> = ActionCreatorWithPreparedPayload<CR['prepare'], string>;
declare type ActionCreatorForCaseSagas<CR> = CR extends CustomCaseSaga ? CR['fn'] extends (action: infer Action) => any ? Action extends {
payload: infer P;
} ? PayloadActionCreator<P> : ActionCreatorWithoutPayload : ActionCreatorWithoutPayload : CR extends (action: infer Action) => any ? Action extends {
payload: infer P;
} ? PayloadActionCreator<P> : ActionCreatorWithoutPayload : ActionCreatorWithoutPayload;
export declare type CaseSagaActions<CaseSagas extends SliceCaseSagas> = {
[Type in keyof CaseSagas]: CaseSagas[Type] extends {
prepare: any;
} ? ActionCreatorForCaseSagaWithPrepare<CaseSagas[Type]> : ActionCreatorForCaseSagas<CaseSagas[Type]>;
};
export declare type ValidateSliceCaseSagas<ACR extends SliceCaseSagas> = ACR & {
[T in keyof ACR]: ACR[T] extends {
saga(action?: infer A): any;
} ? {
prepare(...a: never[]): Omit<A, 'type'>;
} : {};
};
export interface CreateOptionsSliceSaga<CR extends SliceCaseSagas = SliceCaseSagas, Name extends string = string> {
name: Name;
caseSagas: ValidateSliceCaseSagas<CR>;
sagaType?: SagaType;
}
declare type SagaFunReturnType = Generator<AllEffect<CallEffect<any>>, void, unknown>;
export interface Slice<CaseSagas extends SliceCaseSagas = SliceCaseSagas, Name extends string = string> {
name: Name;
saga: () => SagaFunReturnType;
actions: CaseSagaActions<CaseSagas>;
sagaType: SagaType;
}
export declare function createSaga(sagaType: string | number, type: string, sagaFunction: CaseSagas<PayloadAction<any>>): any;
export declare function createSagas(sagas: (() => Generator<unknown, void, SagaIterator>)[]): any;
export declare function getType(slice: string, actionKey: string): string;
export declare function createSliceSaga<CaseSagas extends SliceCaseSagas, Name extends string = string>(options: CreateOptionsSliceSaga<CaseSagas, Name>): Slice<CaseSagas, Name>;
export {};
//# sourceMappingURL=createSliceSaga.d.ts.map