From fa0c86e2fef9b43920e168cfb2f5a022f32c9b24 Mon Sep 17 00:00:00 2001 From: Pierre Zimmermann <64224599+pierrezimmermannbam@users.noreply.github.com> Date: Wed, 19 Jul 2023 13:34:22 +0200 Subject: [PATCH] fix: correct type inference for props when initialProps is used (#1421) * fix: correct type inference for props when initialProps is used * Update src/__tests__/renderHook.test.tsx * refactor: simplify type of Renderhook options --------- Co-authored-by: pierrezimmermann Co-authored-by: Maciej Jastrzebski --- src/__tests__/renderHook.test.tsx | 34 +++++++++++++++++++++++++++++++ src/renderHook.tsx | 14 ++++--------- 2 files changed, 38 insertions(+), 10 deletions(-) diff --git a/src/__tests__/renderHook.test.tsx b/src/__tests__/renderHook.test.tsx index 389f38ffa..6e9f231a5 100644 --- a/src/__tests__/renderHook.test.tsx +++ b/src/__tests__/renderHook.test.tsx @@ -60,3 +60,37 @@ test('allows wrapper components', async () => { expect(result.current).toEqual('provided'); }); + +const useMyHook = (param: number | undefined) => { + return param; +}; + +test('props type is infered correctly when initial props is defined', () => { + const { result, rerender } = renderHook( + (num: number | undefined) => useMyHook(num), + { + initialProps: 5, + } + ); + + expect(result.current).toBe(5); + + rerender(6); + + expect(result.current).toBe(6); +}); + +test('props type is inferred correctly when initial props is explicitly undefined', () => { + const { result, rerender } = renderHook( + (num: number | undefined) => useMyHook(num), + { + initialProps: undefined, + } + ); + + expect(result.current).toBeUndefined(); + + rerender(6); + + expect(result.current).toBe(6); +}); diff --git a/src/renderHook.tsx b/src/renderHook.tsx index 35965d00a..ada485dc4 100644 --- a/src/renderHook.tsx +++ b/src/renderHook.tsx @@ -8,16 +8,10 @@ export type RenderHookResult = { unmount: () => void; }; -export type RenderHookOptions = Props extends - | object - | string - | number - | boolean - ? { - initialProps: Props; - wrapper?: ComponentType; - } - : { wrapper?: ComponentType; initialProps?: never } | undefined; +export type RenderHookOptions = { + initialProps?: Props; + wrapper?: ComponentType; +}; export function renderHook( renderCallback: (props: Props) => Result,