floating-ui / react-popper

🍿⚛Official React library to use Popper, the positioning library
https://popper.js.org/react-popper/
MIT License
2.5k stars 226 forks source link

ts error happened when run the Official demo #450

Open 17dun opened 1 year ago

17dun commented 1 year ago

when I run the official example https://popper.js.org/react-popper/v2/

import React, { useState } from 'react'; import { usePopper } from 'react-popper';

const Example = () => { const [referenceElement, setReferenceElement] = useState(null); const [popperElement, setPopperElement] = useState(null); const [arrowElement, setArrowElement] = useState(null); const { styles, attributes } = usePopper(referenceElement, popperElement, { modifiers: [{ name: 'arrow', options: { element: arrowElement } }], });

return ( <>

  <div ref={setPopperElement} style={styles.popper} {...attributes.popper}>
    Popper element
    <div ref={setArrowElement} style={styles.arrow} />
  </div>
</>

); };

I got a ts error as below: `ERROR in src/components/UserSearch/test.tsx:18:12 TS2322: Type 'Dispatch<SetStateAction>' is not assignable to type 'LegacyRef | undefined'. Type 'Dispatch<SetStateAction>' is not assignable to type '(instance: HTMLDivElement | null) => void'. Types of parameters 'value' and 'instance' are incompatible. Type 'HTMLDivElement | null' is not assignable to type 'SetStateAction'. Type 'HTMLDivElement' is not assignable to type 'SetStateAction'. Type 'HTMLDivElement' provides no match for the signature '(prevState: null): null'. 16 | 17 |

18 | <div ref={setPopperElement} style={styles.popper} {...attributes.popper}> | ^^^ 19 | Popper element 20 |

21 |
`

Who can tell me what to do? thx~

zikphil commented 1 year ago

Bump - same

hr23232323 commented 1 year ago

@17dun @zikphil this is the most helpful answer- https://github.com/floating-ui/react-popper/issues/415#issuecomment-821968179

Basically, add explicit typing to the state variables like so-

const [referenceElement, setReferenceElement] = useState<HTMLButtonElement | null>(null)
const [popperElement, setPopperElement] = useState<HTMLDivElement | null>(null)