React.isValidElement(obj) determines obj to be React.ReactElement type












0















I have following piece of code



// type def
interface Props: { children: React.ReactNode }

React.Children.map(this.props.children, child => {

// uh-oh!
if (React.isValidElement(child) && child.props.children) {
// do sth
}
}


Which causes typescript error:




semantic error TS2339 Property 'children' does not exist on type '{}'




type of child befor exectution React.isValidElement is React.ReactNodedefined as:



type React.ReactNode = 
| string
| number
| boolean
| {}
| React.ReactElement<any>
| React.ReactNodeArray
| React.ReactPortal
| null
| undefined


but after execution of React.isValidElement type script determines child to be React.ReactElement<{}> - it expects element to have empty props which causes an error since it assumes that there is no prop children in the element. Code does not compile.



Am I missing something? is there a way to fix that?



my tsconfig:



  "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/**/*"],
}



typescript: 3.2.0

@types/react": ^16.3.13"

@types/react-dom": ^16.0.5"










share|improve this question



























    0















    I have following piece of code



    // type def
    interface Props: { children: React.ReactNode }

    React.Children.map(this.props.children, child => {

    // uh-oh!
    if (React.isValidElement(child) && child.props.children) {
    // do sth
    }
    }


    Which causes typescript error:




    semantic error TS2339 Property 'children' does not exist on type '{}'




    type of child befor exectution React.isValidElement is React.ReactNodedefined as:



    type React.ReactNode = 
    | string
    | number
    | boolean
    | {}
    | React.ReactElement<any>
    | React.ReactNodeArray
    | React.ReactPortal
    | null
    | undefined


    but after execution of React.isValidElement type script determines child to be React.ReactElement<{}> - it expects element to have empty props which causes an error since it assumes that there is no prop children in the element. Code does not compile.



    Am I missing something? is there a way to fix that?



    my tsconfig:



      "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/**/*"],
    }



    typescript: 3.2.0

    @types/react": ^16.3.13"

    @types/react-dom": ^16.0.5"










    share|improve this question

























      0












      0








      0








      I have following piece of code



      // type def
      interface Props: { children: React.ReactNode }

      React.Children.map(this.props.children, child => {

      // uh-oh!
      if (React.isValidElement(child) && child.props.children) {
      // do sth
      }
      }


      Which causes typescript error:




      semantic error TS2339 Property 'children' does not exist on type '{}'




      type of child befor exectution React.isValidElement is React.ReactNodedefined as:



      type React.ReactNode = 
      | string
      | number
      | boolean
      | {}
      | React.ReactElement<any>
      | React.ReactNodeArray
      | React.ReactPortal
      | null
      | undefined


      but after execution of React.isValidElement type script determines child to be React.ReactElement<{}> - it expects element to have empty props which causes an error since it assumes that there is no prop children in the element. Code does not compile.



      Am I missing something? is there a way to fix that?



      my tsconfig:



        "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/**/*"],
      }



      typescript: 3.2.0

      @types/react": ^16.3.13"

      @types/react-dom": ^16.0.5"










      share|improve this question














      I have following piece of code



      // type def
      interface Props: { children: React.ReactNode }

      React.Children.map(this.props.children, child => {

      // uh-oh!
      if (React.isValidElement(child) && child.props.children) {
      // do sth
      }
      }


      Which causes typescript error:




      semantic error TS2339 Property 'children' does not exist on type '{}'




      type of child befor exectution React.isValidElement is React.ReactNodedefined as:



      type React.ReactNode = 
      | string
      | number
      | boolean
      | {}
      | React.ReactElement<any>
      | React.ReactNodeArray
      | React.ReactPortal
      | null
      | undefined


      but after execution of React.isValidElement type script determines child to be React.ReactElement<{}> - it expects element to have empty props which causes an error since it assumes that there is no prop children in the element. Code does not compile.



      Am I missing something? is there a way to fix that?



      my tsconfig:



        "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/**/*"],
      }



      typescript: 3.2.0

      @types/react": ^16.3.13"

      @types/react-dom": ^16.0.5"







      reactjs typescript






      share|improve this question













      share|improve this question











      share|improve this question




      share|improve this question










      asked Jan 19 at 20:43









      Przemek Przemek

      172




      172
























          1 Answer
          1






          active

          oldest

          votes


















          0














          If you know what kind of element you expect, you can pass a type parameter to React.isValidElement.



          Replace this:



          React.isValidElement(child)


          with this:



          React.isValidElement<Props>(child)





          share|improve this answer























            Your Answer






            StackExchange.ifUsing("editor", function () {
            StackExchange.using("externalEditor", function () {
            StackExchange.using("snippets", function () {
            StackExchange.snippets.init();
            });
            });
            }, "code-snippets");

            StackExchange.ready(function() {
            var channelOptions = {
            tags: "".split(" "),
            id: "1"
            };
            initTagRenderer("".split(" "), "".split(" "), channelOptions);

            StackExchange.using("externalEditor", function() {
            // Have to fire editor after snippets, if snippets enabled
            if (StackExchange.settings.snippets.snippetsEnabled) {
            StackExchange.using("snippets", function() {
            createEditor();
            });
            }
            else {
            createEditor();
            }
            });

            function createEditor() {
            StackExchange.prepareEditor({
            heartbeatType: 'answer',
            autoActivateHeartbeat: false,
            convertImagesToLinks: true,
            noModals: true,
            showLowRepImageUploadWarning: true,
            reputationToPostImages: 10,
            bindNavPrevention: true,
            postfix: "",
            imageUploader: {
            brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
            contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
            allowUrls: true
            },
            onDemand: true,
            discardSelector: ".discard-answer"
            ,immediatelyShowMarkdownHelp:true
            });


            }
            });














            draft saved

            draft discarded


















            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f54271231%2freact-isvalidelementobj-determines-obj-to-be-react-reactelement-type%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown

























            1 Answer
            1






            active

            oldest

            votes








            1 Answer
            1






            active

            oldest

            votes









            active

            oldest

            votes






            active

            oldest

            votes









            0














            If you know what kind of element you expect, you can pass a type parameter to React.isValidElement.



            Replace this:



            React.isValidElement(child)


            with this:



            React.isValidElement<Props>(child)





            share|improve this answer




























              0














              If you know what kind of element you expect, you can pass a type parameter to React.isValidElement.



              Replace this:



              React.isValidElement(child)


              with this:



              React.isValidElement<Props>(child)





              share|improve this answer


























                0












                0








                0







                If you know what kind of element you expect, you can pass a type parameter to React.isValidElement.



                Replace this:



                React.isValidElement(child)


                with this:



                React.isValidElement<Props>(child)





                share|improve this answer













                If you know what kind of element you expect, you can pass a type parameter to React.isValidElement.



                Replace this:



                React.isValidElement(child)


                with this:



                React.isValidElement<Props>(child)






                share|improve this answer












                share|improve this answer



                share|improve this answer










                answered Jan 19 at 23:17









                Karol MajewskiKarol Majewski

                2,601212




                2,601212






























                    draft saved

                    draft discarded




















































                    Thanks for contributing an answer to Stack Overflow!


                    • Please be sure to answer the question. Provide details and share your research!

                    But avoid



                    • Asking for help, clarification, or responding to other answers.

                    • Making statements based on opinion; back them up with references or personal experience.


                    To learn more, see our tips on writing great answers.




                    draft saved


                    draft discarded














                    StackExchange.ready(
                    function () {
                    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f54271231%2freact-isvalidelementobj-determines-obj-to-be-react-reactelement-type%23new-answer', 'question_page');
                    }
                    );

                    Post as a guest















                    Required, but never shown





















































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown

































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown







                    Popular posts from this blog

                    Callistus III

                    Ostreoida

                    Plistias Cous