ESLint complains TypeScript type declaration uses type before it was declared





.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty{ height:90px;width:728px;box-sizing:border-box;
}







2















I am creating a builder that has types, the way I declare the type is:



export type BuilderInterface<T> = {
[key in keyof T]: (arg: T[key]) => BuilderInterface<T> } & {
build(): T
}


When running ESLint it complains saying that: "BuilderInteface" was used before it was defined (no-use-before-define). What is normal since I need to assert that each argument functions returns a builder of the same kind.



Which ways do I have to declare this without breaking the eslint rule?
Should I ignore the rule directly? Why?










share|improve this question





























    2















    I am creating a builder that has types, the way I declare the type is:



    export type BuilderInterface<T> = {
    [key in keyof T]: (arg: T[key]) => BuilderInterface<T> } & {
    build(): T
    }


    When running ESLint it complains saying that: "BuilderInteface" was used before it was defined (no-use-before-define). What is normal since I need to assert that each argument functions returns a builder of the same kind.



    Which ways do I have to declare this without breaking the eslint rule?
    Should I ignore the rule directly? Why?










    share|improve this question

























      2












      2








      2








      I am creating a builder that has types, the way I declare the type is:



      export type BuilderInterface<T> = {
      [key in keyof T]: (arg: T[key]) => BuilderInterface<T> } & {
      build(): T
      }


      When running ESLint it complains saying that: "BuilderInteface" was used before it was defined (no-use-before-define). What is normal since I need to assert that each argument functions returns a builder of the same kind.



      Which ways do I have to declare this without breaking the eslint rule?
      Should I ignore the rule directly? Why?










      share|improve this question














      I am creating a builder that has types, the way I declare the type is:



      export type BuilderInterface<T> = {
      [key in keyof T]: (arg: T[key]) => BuilderInterface<T> } & {
      build(): T
      }


      When running ESLint it complains saying that: "BuilderInteface" was used before it was defined (no-use-before-define). What is normal since I need to assert that each argument functions returns a builder of the same kind.



      Which ways do I have to declare this without breaking the eslint rule?
      Should I ignore the rule directly? Why?







      javascript typescript eslint






      share|improve this question













      share|improve this question











      share|improve this question




      share|improve this question










      asked Nov 16 '18 at 13:28









      SirPeopleSirPeople

      2,3621029




      2,3621029
























          2 Answers
          2






          active

          oldest

          votes


















          1














          ESLint is (kind of) correct, because technically you haven't declared the type and you're using it. Recursive types are quite hard to handle. Try using TSLint to see if you get a better result as it understands TypeScript better.



          The TypeScript team are pretty good at recursive types, so it's a valid type.



          Disable the rule or create an exception so the tools let you get on with your job!






          share|improve this answer































            1














            It's because types unlike interfaces are not self-referentiable. You should either decompose your type to avoid self-referencing or use interfaces.



            P.S. The above is in theory... For some reason though, your type works for me (no tslint, just ts). I guess new versions of TS handle this well.
            Check this: https://github.com/Microsoft/TypeScript/issues/3496#issuecomment-128553540



            P.P.S. I just noticed you were talking about JSLint, not TSLint. JSLint of course is not a good tool to check TS code. Give TSLint a try, instead.






            share|improve this answer


























            • Sorry I came back to you late... Thanks for the answer, I understood that ts works, since I only have the eslint problem.

              – SirPeople
              Nov 21 '18 at 8:15












            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%2f53338851%2feslint-complains-typescript-type-declaration-uses-type-before-it-was-declared%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown

























            2 Answers
            2






            active

            oldest

            votes








            2 Answers
            2






            active

            oldest

            votes









            active

            oldest

            votes






            active

            oldest

            votes









            1














            ESLint is (kind of) correct, because technically you haven't declared the type and you're using it. Recursive types are quite hard to handle. Try using TSLint to see if you get a better result as it understands TypeScript better.



            The TypeScript team are pretty good at recursive types, so it's a valid type.



            Disable the rule or create an exception so the tools let you get on with your job!






            share|improve this answer




























              1














              ESLint is (kind of) correct, because technically you haven't declared the type and you're using it. Recursive types are quite hard to handle. Try using TSLint to see if you get a better result as it understands TypeScript better.



              The TypeScript team are pretty good at recursive types, so it's a valid type.



              Disable the rule or create an exception so the tools let you get on with your job!






              share|improve this answer


























                1












                1








                1







                ESLint is (kind of) correct, because technically you haven't declared the type and you're using it. Recursive types are quite hard to handle. Try using TSLint to see if you get a better result as it understands TypeScript better.



                The TypeScript team are pretty good at recursive types, so it's a valid type.



                Disable the rule or create an exception so the tools let you get on with your job!






                share|improve this answer













                ESLint is (kind of) correct, because technically you haven't declared the type and you're using it. Recursive types are quite hard to handle. Try using TSLint to see if you get a better result as it understands TypeScript better.



                The TypeScript team are pretty good at recursive types, so it's a valid type.



                Disable the rule or create an exception so the tools let you get on with your job!







                share|improve this answer












                share|improve this answer



                share|improve this answer










                answered Nov 16 '18 at 13:41









                FentonFenton

                158k46295319




                158k46295319

























                    1














                    It's because types unlike interfaces are not self-referentiable. You should either decompose your type to avoid self-referencing or use interfaces.



                    P.S. The above is in theory... For some reason though, your type works for me (no tslint, just ts). I guess new versions of TS handle this well.
                    Check this: https://github.com/Microsoft/TypeScript/issues/3496#issuecomment-128553540



                    P.P.S. I just noticed you were talking about JSLint, not TSLint. JSLint of course is not a good tool to check TS code. Give TSLint a try, instead.






                    share|improve this answer


























                    • Sorry I came back to you late... Thanks for the answer, I understood that ts works, since I only have the eslint problem.

                      – SirPeople
                      Nov 21 '18 at 8:15
















                    1














                    It's because types unlike interfaces are not self-referentiable. You should either decompose your type to avoid self-referencing or use interfaces.



                    P.S. The above is in theory... For some reason though, your type works for me (no tslint, just ts). I guess new versions of TS handle this well.
                    Check this: https://github.com/Microsoft/TypeScript/issues/3496#issuecomment-128553540



                    P.P.S. I just noticed you were talking about JSLint, not TSLint. JSLint of course is not a good tool to check TS code. Give TSLint a try, instead.






                    share|improve this answer


























                    • Sorry I came back to you late... Thanks for the answer, I understood that ts works, since I only have the eslint problem.

                      – SirPeople
                      Nov 21 '18 at 8:15














                    1












                    1








                    1







                    It's because types unlike interfaces are not self-referentiable. You should either decompose your type to avoid self-referencing or use interfaces.



                    P.S. The above is in theory... For some reason though, your type works for me (no tslint, just ts). I guess new versions of TS handle this well.
                    Check this: https://github.com/Microsoft/TypeScript/issues/3496#issuecomment-128553540



                    P.P.S. I just noticed you were talking about JSLint, not TSLint. JSLint of course is not a good tool to check TS code. Give TSLint a try, instead.






                    share|improve this answer















                    It's because types unlike interfaces are not self-referentiable. You should either decompose your type to avoid self-referencing or use interfaces.



                    P.S. The above is in theory... For some reason though, your type works for me (no tslint, just ts). I guess new versions of TS handle this well.
                    Check this: https://github.com/Microsoft/TypeScript/issues/3496#issuecomment-128553540



                    P.P.S. I just noticed you were talking about JSLint, not TSLint. JSLint of course is not a good tool to check TS code. Give TSLint a try, instead.







                    share|improve this answer














                    share|improve this answer



                    share|improve this answer








                    edited Nov 16 '18 at 13:39

























                    answered Nov 16 '18 at 13:32









                    Nurbol AlpysbayevNurbol Alpysbayev

                    4,8341533




                    4,8341533













                    • Sorry I came back to you late... Thanks for the answer, I understood that ts works, since I only have the eslint problem.

                      – SirPeople
                      Nov 21 '18 at 8:15



















                    • Sorry I came back to you late... Thanks for the answer, I understood that ts works, since I only have the eslint problem.

                      – SirPeople
                      Nov 21 '18 at 8:15

















                    Sorry I came back to you late... Thanks for the answer, I understood that ts works, since I only have the eslint problem.

                    – SirPeople
                    Nov 21 '18 at 8:15





                    Sorry I came back to you late... Thanks for the answer, I understood that ts works, since I only have the eslint problem.

                    – SirPeople
                    Nov 21 '18 at 8:15


















                    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%2f53338851%2feslint-complains-typescript-type-declaration-uses-type-before-it-was-declared%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

                    Bressuire

                    Vorschmack

                    Quarantine