@sigi/core
Version:
Sigi core library
28 lines (27 loc) • 1.92 kB
TypeScript
import { Action } from '@sigi/types';
import { Draft } from 'immer';
import { Observable } from 'rxjs';
import { EffectModule } from './module';
type UnpackEffectPayload<Func> = Func extends (action$: Observable<infer Payload>) => Observable<Action> ? Payload : never;
type UnpackReducerPayload<Func, S> = Func extends (state: S) => S ? void : Func extends (State: S, payload: infer Payload) => S ? Payload : never;
type UnpackImmerReducerPayload<Func, S> = Func extends (state: Draft<S>) => void ? void : Func extends (state: Draft<S>, payload: infer Payload) => void ? Payload : never;
type UnpackDefineActionPayload<OB> = OB extends Observable<infer P> ? P : never;
type UnpackPayload<F, S> = UnpackEffectPayload<F> extends never ? UnpackImmerReducerPayload<F, S> extends never ? UnpackReducerPayload<F, S> extends never ? UnpackDefineActionPayload<F> extends never ? never : UnpackDefineActionPayload<F> : UnpackReducerPayload<F, S> : UnpackImmerReducerPayload<F, S> : UnpackEffectPayload<F>;
export type ActionOfEffectModule<M extends EffectModule<S>, S> = Omit<{
[key in keyof M]: UnpackPayload<M[key], S> extends void ? () => void : (payload: UnpackPayload<M[key], S>) => void;
}, keyof EffectModule<S>> & {
terminate: () => void;
reset: () => void;
noop: () => void;
};
export type InstanceActionOfEffectModule<M extends EffectModule<S>, S> = Omit<{
[key in keyof M]: (payload: UnpackPayload<M[key], S>) => Action<UnpackPayload<M[key], S>>;
}, keyof EffectModule<S>>;
export type RetryActionOfEffectModule<M extends EffectModule<S>, S> = Omit<{
[key in keyof M]: () => Action;
}, keyof EffectModule<S>>;
export type ActionStreamOfEffectModule<M extends EffectModule<S>, S> = Omit<{
[key in keyof M]: Observable<UnpackPayload<M[key], S>>;
}, keyof EffectModule<S>>;
export type StateInEffectModule<M extends EffectModule<any>> = M extends EffectModule<infer S> ? S : never;
export {};