Skip to content

Commit e60fa65

Browse files
authored
feat: add typing support for react 19 (#1627)
Change adapts to types changes of React19. Otherwise no changes done. Deprecated `MutableRefObject` remained to ensure backwards compatibility.
1 parent 3ddbe89 commit e60fa65

File tree

20 files changed

+47
-60
lines changed

20 files changed

+47
-60
lines changed

eslint.config.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,12 @@ const config = [
1515
...mdConfig,
1616
...typescriptConfig,
1717
...vitestConfig,
18+
{
19+
files: ['**/*.ts'],
20+
rules: {
21+
'@typescript-eslint/no-deprecated': 'off',
22+
},
23+
},
1824
];
1925

2026
export default config;

package.json

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,8 @@
4949
},
5050
"peerDependencies": {
5151
"js-cookie": "^3.0.5",
52-
"react": "^16.8 || ^17 || ^18",
53-
"react-dom": "^16.8 || ^17 || ^18"
52+
"react": "^16.8 || ^17 || ^18 || ^19",
53+
"react-dom": "^16.8 || ^17 || ^18 || ^19"
5454
},
5555
"peerDependenciesMeta": {
5656
"js-cookie": {
@@ -64,8 +64,8 @@
6464
"@react-hookz/eslint-formatter-gha": "^3.0.4",
6565
"@testing-library/react-hooks": "^8.0.1",
6666
"@types/js-cookie": "^3.0.6",
67-
"@types/react": "^17.0.83",
68-
"@types/react-dom": "^17.0.26",
67+
"@types/react": "^19.0.10",
68+
"@types/react-dom": "^19.0.4",
6969
"@vitest/coverage-v8": "^3.0.8",
7070
"commitlint": "^19.7.1",
7171
"eslint": "^9.21.0",

src/useAsync/index.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,8 +72,8 @@ export function useAsync<Result, Args extends unknown[] = unknown[]>(
7272
error: undefined,
7373
result: initialValue,
7474
});
75-
const promiseRef = useRef<Promise<Result>>();
76-
const argsRef = useRef<Args>();
75+
const promiseRef = useRef<Promise<Result>>(undefined);
76+
const argsRef = useRef<Args>(undefined);
7777

7878
const methods = useSyncedRef({
7979
execute(...params: Args) {

src/useAsyncAbortable/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ export function useAsyncAbortable<Result, Args extends unknown[] = unknown[]>(
5959
UseAsyncAbortableActions<Result, Args>,
6060
UseAsyncAbortableMeta<Result, Args>,
6161
] {
62-
const abortController = useRef<AbortController>();
62+
const abortController = useRef<AbortController>(undefined);
6363

6464
const fn = async (...args: Args): Promise<Result> => {
6565
// Abort previous async

src/useClickOutside/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ const DEFAULT_EVENTS = ['mousedown', 'touchstart'];
1313
* 'mousedown', 'touchstart'
1414
*/
1515
export function useClickOutside<T extends HTMLElement>(
16-
ref: RefObject<T> | MutableRefObject<T>,
16+
ref: RefObject<T | null> | MutableRefObject<T | null>,
1717
callback: EventListener,
1818
events: string[] = DEFAULT_EVENTS,
1919
): void {

src/useCustomCompareEffect/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ export function useCustomCompareEffect<
2929
effectHook: EffectHook<Callback, Deps, HookRestArgs> = useEffect,
3030
...effectHookRestArgs: R
3131
): void {
32-
const dependencies = useRef<Deps>();
32+
const dependencies = useRef<Deps>(undefined);
3333

3434
// Effects are not run during SSR, therefore, it makes no sense to invoke the comparator
3535
if (

src/useCustomCompareMemo/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ export const useCustomCompareMemo = <T, Deps extends DependencyList>(
1414
deps: Deps,
1515
comparator: DependenciesComparator<Deps>,
1616
): T => {
17-
const dependencies = useRef<Deps>();
17+
const dependencies = useRef<Deps>(undefined);
1818

1919
if (dependencies.current === undefined || !comparator(dependencies.current, deps)) {
2020
dependencies.current = deps;

src/useDebouncedCallback/index.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,10 @@ export function useDebouncedCallback<Fn extends (...args: any[]) => any>(
2222
delay: number,
2323
maxWait = 0,
2424
): DebouncedFunction<Fn> {
25-
const timeout = useRef<ReturnType<typeof setTimeout>>();
26-
const waitTimeout = useRef<ReturnType<typeof setTimeout>>();
25+
const timeout = useRef<ReturnType<typeof setTimeout>>(undefined);
26+
const waitTimeout = useRef<ReturnType<typeof setTimeout>>(undefined);
2727
const cb = useRef(callback);
28-
const lastCall = useRef<{args: Parameters<Fn>; this: ThisParameterType<Fn>}>();
28+
const lastCall = useRef<{args: Parameters<Fn>; this: ThisParameterType<Fn>}>(undefined);
2929

3030
const clear = () => {
3131
if (timeout.current) {
@@ -83,6 +83,6 @@ export function useDebouncedCallback<Fn extends (...args: any[]) => any>(
8383
});
8484

8585
return wrapped;
86-
// eslint-disable-next-line react-hooks/exhaustive-deps,@typescript-eslint/no-unsafe-assignment
86+
// eslint-disable-next-line react-hooks/exhaustive-deps
8787
}, [delay, maxWait, ...deps]);
8888
}

src/useEventListener/index.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import {hasOwnProperty, off, on} from '../util/misc.js';
1111
* something like `[eventName, listener, options]`.
1212
*/
1313
export function useEventListener<T extends EventTarget>(
14-
target: RefObject<T> | T | null,
14+
target: RefObject<T | null> | T | null,
1515
...params:
1616
| Parameters<T['addEventListener']>
1717
| [string, EventListenerOrEventListenerObject | ((...args: any[]) => any), ...any]
@@ -60,6 +60,6 @@ export function useEventListener<T extends EventTarget>(
6060
}, [target, params[0]]);
6161
}
6262

63-
function isRefObject<T>(target: RefObject<T> | T | null): target is RefObject<T> {
63+
function isRefObject<T>(target: RefObject<T | null> | T | null): target is RefObject<T | null> {
6464
return target !== null && typeof target === 'object' && hasOwnProperty(target, 'current');
6565
}

src/useHookableRef/index.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ export function useHookableRef<T>(
88
onSet?: HookableRefHandler<T>,
99
onGet?: HookableRefHandler<T>
1010
): MutableRefObject<T>;
11-
export function useHookableRef<T = undefined>(): MutableRefObject<T | undefined>;
11+
export function useHookableRef<T = undefined>(): MutableRefObject<T | null | undefined>;
1212

1313
/**
1414
* Like `React.useRef` but it is possible to define get and set handlers.
@@ -23,7 +23,7 @@ export function useHookableRef<T>(
2323
initialValue?: T,
2424
onSet?: HookableRefHandler<T>,
2525
onGet?: HookableRefHandler<T>,
26-
): MutableRefObject<T | undefined> {
26+
): MutableRefObject<T | null | undefined> {
2727
const onSetRef = useSyncedRef(onSet);
2828
const onGetRef = useSyncedRef(onGet);
2929

0 commit comments

Comments
 (0)