TSLint mentions problems with generic Handler










1















I use an event dispatcher to register and fire events within classes in TypeScript. The code works fine. For a better code quality I use TSLint, which is unhappy about a the way I declare the handler, but I do not understand the description.



The code fragment:



export type Handler<E> = (event: E) => void;

export class EventDispatcher<E>
private handlers: Handler<E> = ;

public fire(event: E)
for (const h of this.handlers)
h(event);



public register(handler: Handler<E>)
this.handlers.push(handler);




TSLint is unhappy about line 4 in the code, specifically about Handler<E>. The message is:




[tslint] Array type using 'T' is forbidden for non-simple types. Use
'Array' instead. (array-type) [tslint] Array type using 'T' is
forbidden for non-simple types. Use 'Array' instead. type
Handler = (event: E) => void




I do not fully understand what TSLint wants me to do. Why is T forbidden? What is meant with a non-simple type? It also sais that I should use an array instead, but Handler<E> already is an array. So where is there problem?










share|improve this question


























    1















    I use an event dispatcher to register and fire events within classes in TypeScript. The code works fine. For a better code quality I use TSLint, which is unhappy about a the way I declare the handler, but I do not understand the description.



    The code fragment:



    export type Handler<E> = (event: E) => void;

    export class EventDispatcher<E>
    private handlers: Handler<E> = ;

    public fire(event: E)
    for (const h of this.handlers)
    h(event);



    public register(handler: Handler<E>)
    this.handlers.push(handler);




    TSLint is unhappy about line 4 in the code, specifically about Handler<E>. The message is:




    [tslint] Array type using 'T' is forbidden for non-simple types. Use
    'Array' instead. (array-type) [tslint] Array type using 'T' is
    forbidden for non-simple types. Use 'Array' instead. type
    Handler = (event: E) => void




    I do not fully understand what TSLint wants me to do. Why is T forbidden? What is meant with a non-simple type? It also sais that I should use an array instead, but Handler<E> already is an array. So where is there problem?










    share|improve this question
























      1












      1








      1








      I use an event dispatcher to register and fire events within classes in TypeScript. The code works fine. For a better code quality I use TSLint, which is unhappy about a the way I declare the handler, but I do not understand the description.



      The code fragment:



      export type Handler<E> = (event: E) => void;

      export class EventDispatcher<E>
      private handlers: Handler<E> = ;

      public fire(event: E)
      for (const h of this.handlers)
      h(event);



      public register(handler: Handler<E>)
      this.handlers.push(handler);




      TSLint is unhappy about line 4 in the code, specifically about Handler<E>. The message is:




      [tslint] Array type using 'T' is forbidden for non-simple types. Use
      'Array' instead. (array-type) [tslint] Array type using 'T' is
      forbidden for non-simple types. Use 'Array' instead. type
      Handler = (event: E) => void




      I do not fully understand what TSLint wants me to do. Why is T forbidden? What is meant with a non-simple type? It also sais that I should use an array instead, but Handler<E> already is an array. So where is there problem?










      share|improve this question














      I use an event dispatcher to register and fire events within classes in TypeScript. The code works fine. For a better code quality I use TSLint, which is unhappy about a the way I declare the handler, but I do not understand the description.



      The code fragment:



      export type Handler<E> = (event: E) => void;

      export class EventDispatcher<E>
      private handlers: Handler<E> = ;

      public fire(event: E)
      for (const h of this.handlers)
      h(event);



      public register(handler: Handler<E>)
      this.handlers.push(handler);




      TSLint is unhappy about line 4 in the code, specifically about Handler<E>. The message is:




      [tslint] Array type using 'T' is forbidden for non-simple types. Use
      'Array' instead. (array-type) [tslint] Array type using 'T' is
      forbidden for non-simple types. Use 'Array' instead. type
      Handler = (event: E) => void




      I do not fully understand what TSLint wants me to do. Why is T forbidden? What is meant with a non-simple type? It also sais that I should use an array instead, but Handler<E> already is an array. So where is there problem?







      typescript tslint






      share|improve this question













      share|improve this question











      share|improve this question




      share|improve this question










      asked Nov 13 '18 at 9:05









      SocratesSocrates

      1,61472344




      1,61472344






















          1 Answer
          1






          active

          oldest

          votes


















          1














          Arrays of non-simple types are hard to read. Consider a variable defined as:



          let foo: prop1: string; prop2: string;


          It might be easy to miss the at the end with such a log item type. Even in your case since the item of the array is a generic type it might be easy to miss the at the end after the <..>.



          The linter wants you to use the long form of array, the generic Array<T> type. The two forms are perfectly equivalent, so it's just a readability issue. In your case, this should work



          export type Handler<E> = (event: E) => void;

          export class EventDispatcher<E>
          private handlers: Array<Handler<E>> = ;

          public fire(event: E)
          for (const h of this.handlers)
          h(event);



          public register(handler: Handler<E>)
          this.handlers.push(handler);







          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%2f53277322%2ftslint-mentions-problems-with-generic-handler%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









            1














            Arrays of non-simple types are hard to read. Consider a variable defined as:



            let foo: prop1: string; prop2: string;


            It might be easy to miss the at the end with such a log item type. Even in your case since the item of the array is a generic type it might be easy to miss the at the end after the <..>.



            The linter wants you to use the long form of array, the generic Array<T> type. The two forms are perfectly equivalent, so it's just a readability issue. In your case, this should work



            export type Handler<E> = (event: E) => void;

            export class EventDispatcher<E>
            private handlers: Array<Handler<E>> = ;

            public fire(event: E)
            for (const h of this.handlers)
            h(event);



            public register(handler: Handler<E>)
            this.handlers.push(handler);







            share|improve this answer



























              1














              Arrays of non-simple types are hard to read. Consider a variable defined as:



              let foo: prop1: string; prop2: string;


              It might be easy to miss the at the end with such a log item type. Even in your case since the item of the array is a generic type it might be easy to miss the at the end after the <..>.



              The linter wants you to use the long form of array, the generic Array<T> type. The two forms are perfectly equivalent, so it's just a readability issue. In your case, this should work



              export type Handler<E> = (event: E) => void;

              export class EventDispatcher<E>
              private handlers: Array<Handler<E>> = ;

              public fire(event: E)
              for (const h of this.handlers)
              h(event);



              public register(handler: Handler<E>)
              this.handlers.push(handler);







              share|improve this answer

























                1












                1








                1







                Arrays of non-simple types are hard to read. Consider a variable defined as:



                let foo: prop1: string; prop2: string;


                It might be easy to miss the at the end with such a log item type. Even in your case since the item of the array is a generic type it might be easy to miss the at the end after the <..>.



                The linter wants you to use the long form of array, the generic Array<T> type. The two forms are perfectly equivalent, so it's just a readability issue. In your case, this should work



                export type Handler<E> = (event: E) => void;

                export class EventDispatcher<E>
                private handlers: Array<Handler<E>> = ;

                public fire(event: E)
                for (const h of this.handlers)
                h(event);



                public register(handler: Handler<E>)
                this.handlers.push(handler);







                share|improve this answer













                Arrays of non-simple types are hard to read. Consider a variable defined as:



                let foo: prop1: string; prop2: string;


                It might be easy to miss the at the end with such a log item type. Even in your case since the item of the array is a generic type it might be easy to miss the at the end after the <..>.



                The linter wants you to use the long form of array, the generic Array<T> type. The two forms are perfectly equivalent, so it's just a readability issue. In your case, this should work



                export type Handler<E> = (event: E) => void;

                export class EventDispatcher<E>
                private handlers: Array<Handler<E>> = ;

                public fire(event: E)
                for (const h of this.handlers)
                h(event);



                public register(handler: Handler<E>)
                this.handlers.push(handler);








                share|improve this answer












                share|improve this answer



                share|improve this answer










                answered Nov 13 '18 at 9:09









                Titian Cernicova-DragomirTitian Cernicova-Dragomir

                63.1k33756




                63.1k33756



























                    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%2f53277322%2ftslint-mentions-problems-with-generic-handler%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

                    Use pre created SQLite database for Android project in kotlin

                    Darth Vader #20

                    Ondo