Fix Flow Node Issue “property querySelector of unknown”
Flow, the static type checker used in many React projects, feels like a gift and a curse at times; a gift in that it identifies weaknesses in your code, and a curse that sometimes you feel like you're needlessly adjusting your code to satisfy Flow. I've grown to appreciate Flow but that doesn't mean I end up spending extra hours finding new ways to code.
I recently ran into an issue where I was querying for a node in a React element and then using querySelector
on that node to find a child; surprisingly Flow took issue:
Cannot call node.querySelector because property querySelector of unknown type [1] is not a function. 71│ const { maxHeight } = this.state; 72│ const node = ReactDOM.findDOMNode(this); [1] 73│ if (node && node.querySelector) { 74│ const popupNode = node.querySelector(".preview-popup"); 75│ if (popupNode) { 76│ popupNode.style.maxHeight = `${maxHeight}px`; 77│ } /private/tmp/flow/flowlib_34a4c903/react-dom.js [1] 14│ ): null | Element | Text; Found 1 error
It turns out that findDOMNode
can return type Text
, and thus querySelectorAll
would be undefined
; Flow doesn't like undefined
. The solution is to use instanceOf
with HTMLElement
:
if (node instanceOf HTMLElement) { // ... }
The solution makes sense but a part of me silently rages that && node.querySelector
doesn't qualify. In the end, Flow is so helpful that little changes like this don't get me too wound up.