Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How fixed typescript error in custom hook

I use this ResizeObserver hook in my project with typescript


const useResizeObserver = () => {
  const [entry, setEntry] = useState<ResizeObserverEntry>();
  const [node, setNode] = useState<Element | null>(null);
  const observer = useRef<ResizeObserver | null>(null);

  const disconnect = useCallback(() => {
    const { current } = observer;
    if (current) {
      current.disconnect();
    }
  }, []);

  const observe = useCallback(() => {
    observer.current = new ResizeObserver(([entry1]) => setEntry(entry1));
    if (node) {
      observer.current.observe(node);
    }
  }, [node]);

  useLayoutEffect(() => {
    observe();
    return () => disconnect();
  }, [disconnect, observe]);

  return [setNode, entry];
};
const [node, entry] = useResizeObserver();
<div ref={node}>content</div>

When i use this hook in my component, I get this error

Type 'Dispatch<SetStateAction<Element | null>> | ResizeObserverEntry | undefined' is not assignable to type 'string | ((instance: HTMLTableHeaderCellElement | null) => void) | RefObject | null | undefined'. Type 'ResizeObserverEntry' is not assignable to type 'string | ((instance: HTMLTableHeaderCellElement | null) => void) | RefObject | null | undefined'. Property 'current' is missing in type 'ResizeObserverEntry' but required in type 'RefObject'.

Help fixed

like image 863
user14036415 Avatar asked Jan 26 '26 00:01

user14036415


2 Answers

I figured out that the issue came from typescript infer as union types as we mix an array [setNode, entry]. So in order to fix this issue, you simply set that as fixed return array as below:

return [setNode, entry] as const;

Note: This const assertions is only featured from v3.4 https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-4.html#const-assertions

like image 189
tmhao2005 Avatar answered Jan 28 '26 14:01

tmhao2005


You are returning setNode as the first element in the return array and try to use it as a TableHeader ref.

setNode can't be used as a ref, see here on how refs are used

like image 37
thedude Avatar answered Jan 28 '26 14:01

thedude



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!