Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Typescript React forwardRef with Union/Generic Element

I'm trying to implement element that can be div or button element


type customElement = HTMLDivElement | HTMLDivElement   .....

const Element = React.forwardRef<customElement, somePropInterface>((props,ref)=>{
  if(someCase){
   return <div ref={ref}
  }else if(someCase2){
   return <button ref={ref}
  }else{
   return <a ref={ref}
  }
})

or Generic case

const Element = React.forwardRef((props,ref)=>{
  return <T ref={ref}/> // element with T...
})

Problem is that it is not easy to type guard React.ref each case for typescript(div, a, button...)

I tried to use custom typeguard but not sure what to check for each element

function isDivRef(
  ref: React.Ref<HTMLDivElement>,
  element: "div" | "button"
): ref is React.Ref<HTMLDivElement> {
  return ?????
}
like image 353
홍우지 Avatar asked Aug 19 '26 18:08

홍우지


1 Answers

I was facing the same issue in a project I'm working on. After trying a few different combinations using union types, I found out -- by trial and error -- that to use more than one type with React.forwardRef, it's required to use an intersection instead of a union. This way:

const Element = React.forwardRef<HTMLAnchorElement & HTMLButtonElement, Props>(
  (props, ref) => {
    if (...) {
      return <a ref={ref} ... />
    }
    return <button ref={ref} ... />
  }
);
like image 190
Gustavo Straube Avatar answered Aug 22 '26 12:08

Gustavo Straube