Skip to content

Commit dc1abec

Browse files
committed
fix: fix render hook typing
1 parent e5fa23c commit dc1abec

File tree

3 files changed

+20
-17
lines changed

3 files changed

+20
-17
lines changed

src/__tests__/render-hook.test.tsx

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -60,32 +60,29 @@ test('allows wrapper components', () => {
6060
expect(result.current).toEqual('provided');
6161
});
6262

63-
const useMyHook = (param: number | undefined) => {
64-
return param;
65-
};
63+
function useMyHook<T>(param: T) {
64+
return { param };
65+
}
6666

6767
test('props type is inferred correctly when initial props is defined', () => {
68-
const { result, rerender } = renderHook((num: number | undefined) => useMyHook(num), {
68+
const { result, rerender } = renderHook((num: number) => useMyHook(num), {
6969
initialProps: 5,
7070
});
71-
72-
expect(result.current).toBe(5);
71+
expect(result.current.param).toBe(5);
7372

7473
rerender(6);
75-
76-
expect(result.current).toBe(6);
74+
expect(result.current.param).toBe(6);
7775
});
7876

7977
test('props type is inferred correctly when initial props is explicitly undefined', () => {
8078
const { result, rerender } = renderHook((num: number | undefined) => useMyHook(num), {
8179
initialProps: undefined,
8280
});
8381

84-
expect(result.current).toBeUndefined();
82+
expect(result.current.param).toBeUndefined();
8583

8684
rerender(6);
87-
88-
expect(result.current).toBe(6);
85+
expect(result.current.param).toBe(6);
8986
});
9087

9188
/**

src/render-hook.tsx

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,16 @@ import * as React from 'react';
22

33
import render from './render';
44
import renderAsync from './render-async';
5+
import type { RefObject } from './types';
56

67
export type RenderHookResult<Result, Props> = {
7-
result: React.RefObject<Result>;
8+
result: RefObject<Result>;
89
rerender: (props: Props) => void;
910
unmount: () => void;
1011
};
1112

1213
export type RenderHookAsyncResult<Result, Props> = {
13-
result: React.RefObject<Result>;
14+
result: RefObject<Result>;
1415
rerenderAsync: (props: Props) => Promise<void>;
1516
unmountAsync: () => Promise<void>;
1617
};
@@ -39,7 +40,7 @@ export function renderHook<Result, Props>(
3940
hookToRender: (props: Props) => Result,
4041
options?: RenderHookOptions<Props>,
4142
): RenderHookResult<Result, Props> {
42-
const result: React.RefObject<Result | null> = React.createRef();
43+
const result = React.createRef<Result>();
4344

4445
function HookContainer({ hookProps }: { hookProps: Props }) {
4546
const renderResult = hookToRender(hookProps);
@@ -59,7 +60,7 @@ export function renderHook<Result, Props>(
5960

6061
return {
6162
// Result should already be set after the first render effects are run.
62-
result: result as React.RefObject<Result>,
63+
result: result as RefObject<Result>,
6364
rerender: (hookProps: Props) => rerenderComponent(<HookContainer hookProps={hookProps} />),
6465
unmount,
6566
};
@@ -69,7 +70,7 @@ export async function renderHookAsync<Result, Props>(
6970
hookToRender: (props: Props) => Result,
7071
options?: RenderHookOptions<Props>,
7172
): Promise<RenderHookAsyncResult<Result, Props>> {
72-
const result: React.RefObject<Result | null> = React.createRef();
73+
const result = React.createRef<Result>();
7374

7475
function TestComponent({ hookProps }: { hookProps: Props }) {
7576
const renderResult = hookToRender(hookProps);
@@ -89,7 +90,7 @@ export async function renderHookAsync<Result, Props>(
8990

9091
return {
9192
// Result should already be set after the first render effects are run.
92-
result: result as React.RefObject<Result>,
93+
result: result as RefObject<Result>,
9394
rerenderAsync: (hookProps: Props) =>
9495
rerenderComponentAsync(<TestComponent hookProps={hookProps} />),
9596
unmountAsync,

src/types.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
/** `RefObject` type from React 19. */
2+
export type RefObject<T> = {
3+
current: T;
4+
};
5+
16
/**
27
* Location of an element.
38
*/

0 commit comments

Comments
 (0)