updux/src/actions.ts

52 lines
1.3 KiB
TypeScript

export type Action<T extends string = string, TPayload = any> = {
type: T;
meta?: Record<string, unknown>;
payload?: TPayload;
};
export type ActionGenerator<
TType extends string = string,
TPayloadGen = (...args: any[]) => any,
> = {
type: TType;
} & (TPayloadGen extends (...args: any) => any
? ReturnType<TPayloadGen> extends void
? (...args: Parameters<TPayloadGen>) => {
type: TType;
}
: (...args: Parameters<TPayloadGen>) => {
type: TType;
payload: ReturnType<TPayloadGen>;
}
: (...args: any[]) => { type: TType; payload?: unknown });
export function action<
TType extends string,
TPayload extends (...args: any) => any,
>(
type: TType,
payloadFunction?: TPayload,
transformer?: Function,
): ActionGenerator<TType, TPayload> {
let generator: any = function (...payloadArg:any[]) {
const result: Action = { type };
if (payloadFunction) {
result.payload = payloadFunction(...payloadArg);
} else {
if (payloadArg[0] !== undefined) result.payload = payloadArg[0];
}
return result;
};
if (transformer) {
const orig = generator;
generator = (...args: any) => transformer(orig(...args), args);
}
generator.type = type;
return generator;
}