diff --git a/packages/shared/src/interceptor.test-d.ts b/packages/shared/src/interceptor.test-d.ts index e635048a5..694c741e8 100644 --- a/packages/shared/src/interceptor.test-d.ts +++ b/packages/shared/src/interceptor.test-d.ts @@ -57,8 +57,15 @@ it('onError', () => { }) it('onFinish', () => { - const interceptor: Interceptor<{ foo: string }, 'success', 'error'> = onFinish((state, options) => { - expectTypeOf(state).toEqualTypeOf<['success', null, 'success'] | [undefined, 'error', 'error']>() + const interceptor: Interceptor<{ foo: string }, 'success', 'error'> = onFinish(([error, data, isSuccess], options) => { + if (error || !isSuccess) { + expectTypeOf(error).toEqualTypeOf<'error'>() + expectTypeOf(data).toEqualTypeOf() + } + else { + expectTypeOf(error).toEqualTypeOf() + expectTypeOf(data).toEqualTypeOf<'success'>() + } expectTypeOf(options.foo).toEqualTypeOf() expectTypeOf(options.next).toBeCallableWith<[options?: { foo: string }]>() @@ -67,8 +74,16 @@ it('onFinish', () => { os.$context<{ something: string }>().use(onFinish(() => { })) - os.$context<{ something: string }>().use(onFinish((state, { context, next }) => { - expectTypeOf(state).toEqualTypeOf<[Awaited>, null, 'success'] | [undefined, Error, 'error']>() + os.$context<{ something: string }>().use(onFinish(([error, data, isSuccess], { context, next }) => { + if (error || !isSuccess) { + expectTypeOf(error).toEqualTypeOf() + expectTypeOf(data).toEqualTypeOf() + } + else { + expectTypeOf(error).toEqualTypeOf() + expectTypeOf(data).toEqualTypeOf>>() + } + expectTypeOf(context).toEqualTypeOf<{ something: string }>() expectTypeOf(next).toEqualTypeOf>() })).handler(({ context }) => { diff --git a/packages/shared/src/interceptor.test.ts b/packages/shared/src/interceptor.test.ts index 20f37da9d..58ecbe216 100644 --- a/packages/shared/src/interceptor.test.ts +++ b/packages/shared/src/interceptor.test.ts @@ -156,7 +156,7 @@ describe('onStart / onSuccess / onError / onFinish', () => { expect(onFinishFn).toHaveBeenCalledTimes(1) expect(onFinishFn).toHaveBeenCalledWith( - ['__main__', null, 'success'], + [null, '__main__', true], { foo: 'bar', next: expect.any(Function), @@ -197,7 +197,7 @@ describe('onStart / onSuccess / onError / onFinish', () => { expect(onFinishFn).toHaveBeenCalledTimes(1) expect(onFinishFn).toHaveBeenCalledWith( - [undefined, new Error('__error__'), 'error'], + [new Error('__error__'), undefined, false], { foo: 'bar', next: expect.any(Function), diff --git a/packages/shared/src/interceptor.ts b/packages/shared/src/interceptor.ts index cd1a845d1..30c280d6f 100644 --- a/packages/shared/src/interceptor.ts +++ b/packages/shared/src/interceptor.ts @@ -63,7 +63,9 @@ export function onError = [TResult, null, 'success'] | [undefined, TError, 'error'] +export type OnFinishState = + | [error: TError, data: undefined, isSuccess: false] + | [error: null, data: TResult, isSuccess: true] /** * Can used for interceptors or middlewares @@ -83,11 +85,11 @@ export function onFinish { try { const result = await options.next() - state = [result, null, 'success'] + state = [null, result, true] return result } catch (error) { - state = [undefined, error, 'error'] + state = [error, undefined, false] throw error } finally {