diff --git a/src/index.ts b/src/index.ts index 145e453..33938fe 100644 --- a/src/index.ts +++ b/src/index.ts @@ -74,7 +74,7 @@ function rejectPromise>(action: TA, executor: () => ResolveValueFromTriggerAction) { +export function* implementPromiseAction>(action: TA, executor: TriggerExecutor>) { verify(action, "implementPromiseAction"); try { @@ -107,6 +107,8 @@ function createPromiseActions(type: T) { }; } +type TriggerExecutor = (() => PromiseLike | RT | Iterator); + function createUpdatedTrigger>( type: T, triggerAction: TA, @@ -129,7 +131,7 @@ function createUpdatedTrigger(action: TA2, executor: () => ResolveValueFromTriggerAction) => ReturnType, + implement: implementPromiseAction as >(action: TA2, executor: TriggerExecutor) => ReturnType, resolve: resolvePromiseAction as (action: TA2, value: ResolveValueFromTriggerAction) => ReturnType, reject: rejectPromiseAction as (action: TA2, error: any) => ReturnType, }; diff --git a/test/index.test.ts b/test/index.test.ts index a72f19d..424ec67 100644 --- a/test/index.test.ts +++ b/test/index.test.ts @@ -190,6 +190,13 @@ describe("implementPromiseAction", function () { store.dispatch(sagas.controlAction({})); expect(caughtMiddlewareError() instanceof ConfigurationError).toBeTruthy(); }); + + it("should correctly infer value type", function () { + const promiseAction = promiseActionFactory().simple("test"); + call(promiseAction.sagas.implement, promiseAction(), async () => Promise.resolve("")); + call(promiseAction.sagas.implement, promiseAction(), function* () { yield "dummy"; return ""; }); + call(promiseAction.sagas.implement, promiseAction(), () => ""); + }); }); describe("resolvePromiseAction", function () { @@ -232,6 +239,12 @@ describe("resolvePromiseAction", function () { store.dispatch(sagas.controlAction({})); expect(caughtMiddlewareError() instanceof ConfigurationError).toBeTruthy(); }); + + it("should correctly infer value type", function () { + const promiseAction = promiseActionFactory().simple("test"); + call(promiseAction.sagas.resolve, promiseAction(), ""); + call(promiseAction.sagas.resolve, promiseAction.trigger(), ""); + }); }); describe("rejectPromiseAction", function () {