9

I have built a component that will determine its opening direction based on its dimension and position in the window. I used getBoundingClientRect() function on a react-dom node. Now i have updated some of project packages including react and react-dom to 16.3.2. Now I get a compile error:

Property 'getBoundingClientRect' does not exist on type 'Element | Text'

here is a piece of code that use this function:

const node = ReactDOM.findDOMNode(this.containerElement);

if (!node) {
  return;
}

let vertical: Vertical_Direction;
if (verticalDirection === Vertical_Direction.DOWN_UP) {
  const windowHeight = window.innerHeight;
  const height: number = Math.min(containerHeight, node.getBoundingClientRect().height);

Any help or suggestion to achieve this functionality will be appreciated.

Edit2: the cause of this problem is updating @types/react-dom to 16.0.5 version.

farzad
  • 368
  • 1
  • 3
  • 15

1 Answers1

14

The getBoundingClientRect function only exists on the Element class, and not Text, so you'll need to cast the type of your element like so:

const node = ReactDOM.findDOMNode(this.containerElement) as Element

An alternative, safer route would be to check the instance type at runtime, and typescript will intelligently cast the type after the check. But as you can see, it might be a little unnecessarily verbose for this case:

const node = ReactDOM.findDOMNode(this.containerElement)

// ...

if (!(node instanceof Element)) return

// type of node should be Element

Either way, go with whatever you prefer.

kingdaro
  • 11,528
  • 3
  • 34
  • 38
  • thanks. it worked. I wonder why they change that in this version. @kingdaro – farzad Apr 28 '18 at 08:20
  • Sure :) and probably for correctness, since, if the component returns a string from its render method, you'll get back a text node, as the new type suggests – kingdaro Apr 28 '18 at 08:23