title: React.isValidElement(obj) determines obj to be React.ReactElement<{}> type
body: <p>I have following piece of code</p>
  
  <pre><code>// type def
  interface Props: { children: React.ReactNode }
  
  React.Children.map(this.props.children, child =&gt; {
  
    // uh-oh!
    if (React.isValidElement(child)  &amp;&amp; child.props.children) {
      // do sth
    }
  }
  </code></pre>
  
  <p>Which causes typescript error:</p>
  
  <blockquote>
    <p>semantic error TS2339 Property 'children' does not exist on type '{}'</p>
  </blockquote>
  
  <p>type of <code>child</code> befor exectution <code>React.isValidElement</code> is <code>React.ReactNode</code>defined as: </p>
  
  <pre><code>type React.ReactNode = 
    | string 
    | number 
    | boolean 
    | {} 
    | React.ReactElement&lt;any&gt; 
    | React.ReactNodeArray 
    | React.ReactPortal 
    | null 
    | undefined
  </code></pre>
  
  <p>but after execution of <code>React.isValidElement</code> type script determines child to be <code>React.ReactElement&lt;{}&gt;</code> - it expects element to have empty <code>props</code> which causes an error since it assumes that there is no prop <code>children</code> in the element. Code does not compile.</p>
  
  <p>Am I missing something? is there a way to fix that?</p>
  
  <p>my <code>tsconfig</code>:</p>
  
  <pre><code>  "compilerOptions": {
      "outDir": "build",
      "module": "esnext",
      "target": "es5",
      "lib": ["es6", "dom", "es2016", "es2017"],
      "sourceMap": true,
      "allowJs": false,
      "jsx": "react",
      "declaration": true,
      "moduleResolution": "node",
      "forceConsistentCasingInFileNames": true,
      "noImplicitReturns": true,
      "noImplicitThis": true,
      "noImplicitAny": true,
      "strictNullChecks": true,
      "suppressImplicitAnyIndexErrors": true,
      "noUnusedLocals": true,
      "noUnusedParameters": true,
      "removeComments": true,
      "preserveConstEnums": true,
      "skipLibCheck": true
    },
    "include": ["./src/**/*"],
  }
  
  </code></pre>
  
  <p>typescript: 3.2.0<br>
  @types/react": ^16.3.13"<br>
  @types/react-dom": ^16.0.5"</p>