'useRef TypeScript - not assignable to type LegacyRef<HTMLDivElement>
I am trying to use useRef
with TypeScript but am having some trouble.
With my RefObject
(I assume) I need to access current
. (ie node.current
)
I have tried the following
const node: RefObject<HTMLElement> = useRef(null);
const node = useRef<HTMLElement | null>(null);
but when I go to set the ref
I am always told that X is not assignable to type 'LegacyRef<HTMLDivElement> | undefined'.
return <div ref={ node }>{ children }</div>
Edit: this should not be restricted to any one type of element so not just HTMLDivElement | HTMLFormElement | HTMLInputElement
Edit: This should work as an example
import React, { useRef, RefObject } from 'react';
function Test()
{
// const node = useRef(null);
// const node: RefObject<HTMLElement> = useRef(null);
const node = useRef<HTMLElement | null>(null);
if (
node &&
node.current &&
node.current.contains()
){ console.log("current accessed")}
return <div ref={ node }></div>
}
Solution 1:[1]
Just import React:
import React, { useRef } from 'react';
function Test() {
const node = useRef<HTMLDivElement>(null);
if (
node &&
node.current &&
node.current.contains()
){ console.log("current accessed")}
return <div ref={node}></div>
}
I made an update. Use HTMLDivElement
as generic parameter instead of HTMLElement | null
. Also, contains
expects an argument.
UPDATE
useRef
expects generic argument of DOM element type. You don't need to use | null
because RefObject
already knows that current
might be null.
See next type:
interface RefObject<T> {
readonly current: T | null
}
TS & React are smart enough to figure out that your ref might be null
Solution 2:[2]
None of the above worked for me, but turns out the solution was quite simple...
All I was doing wrong was not explicitly including "null" as the parameter in the useRef initialization (it expects null, not undefined). Also you CANNOT use "HTMLElement" as your ref type, you have to be more specific, so for me it was "HTMLDivElement" for example).
So working code for me was something like this:
const ref = useRef<HTMLDivElement>(null);
return <div ref={ref}> Some Content... </div>
Solution 3:[3]
I came here looking for help with an iframe ref. Perhaps this solution will help someone else that's looking for the same thing. I replaced HTMLDivElement
with HTMLIFrameElement
so:
const node = useRef<HTMLIFrameElement>(null);
Solution 4:[4]
Key is to use HTMLElement and undefined for initialization
const node = useRef<HTMLElement>();
Solution 5:[5]
The same stands for the <svg>
elements:
const ref = useRef<SVGSVGElement>(null)
...
<svg ref={ref} />
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 | Ya Zhuang |
Solution 2 | Sheldonfrith |
Solution 3 | Brady Dowling |
Solution 4 | |
Solution 5 | Comi9 |