Typescript: Overloading event handlers











up vote
0
down vote

favorite












I am trying to extend an existing interface to add additional event handlers. The interface I am extending already has several event handlers defined.



Here is the base interface:



export interface Emitter {

on(event: 'connect', listener: (err: Error) => void ):this;

on(event: 'end', listener: () => void ):this;
}


Here is also the base class:



export class Emitter extends events.EventEmitter {}


Here is my interface:



export interface EmitterExtended extends Emitter {
on(event: 'status', listener: (status: ConnectionStatus) => void ):this;
status?: ConnectionStatus;
}


And here is the error typescript gives:



Interface 'EmitterExtended' incorrectly extends interface 'Emitter'.
Types of property 'on' are incompatible.









share|improve this question




























    up vote
    0
    down vote

    favorite












    I am trying to extend an existing interface to add additional event handlers. The interface I am extending already has several event handlers defined.



    Here is the base interface:



    export interface Emitter {

    on(event: 'connect', listener: (err: Error) => void ):this;

    on(event: 'end', listener: () => void ):this;
    }


    Here is also the base class:



    export class Emitter extends events.EventEmitter {}


    Here is my interface:



    export interface EmitterExtended extends Emitter {
    on(event: 'status', listener: (status: ConnectionStatus) => void ):this;
    status?: ConnectionStatus;
    }


    And here is the error typescript gives:



    Interface 'EmitterExtended' incorrectly extends interface 'Emitter'.
    Types of property 'on' are incompatible.









    share|improve this question


























      up vote
      0
      down vote

      favorite









      up vote
      0
      down vote

      favorite











      I am trying to extend an existing interface to add additional event handlers. The interface I am extending already has several event handlers defined.



      Here is the base interface:



      export interface Emitter {

      on(event: 'connect', listener: (err: Error) => void ):this;

      on(event: 'end', listener: () => void ):this;
      }


      Here is also the base class:



      export class Emitter extends events.EventEmitter {}


      Here is my interface:



      export interface EmitterExtended extends Emitter {
      on(event: 'status', listener: (status: ConnectionStatus) => void ):this;
      status?: ConnectionStatus;
      }


      And here is the error typescript gives:



      Interface 'EmitterExtended' incorrectly extends interface 'Emitter'.
      Types of property 'on' are incompatible.









      share|improve this question















      I am trying to extend an existing interface to add additional event handlers. The interface I am extending already has several event handlers defined.



      Here is the base interface:



      export interface Emitter {

      on(event: 'connect', listener: (err: Error) => void ):this;

      on(event: 'end', listener: () => void ):this;
      }


      Here is also the base class:



      export class Emitter extends events.EventEmitter {}


      Here is my interface:



      export interface EmitterExtended extends Emitter {
      on(event: 'status', listener: (status: ConnectionStatus) => void ):this;
      status?: ConnectionStatus;
      }


      And here is the error typescript gives:



      Interface 'EmitterExtended' incorrectly extends interface 'Emitter'.
      Types of property 'on' are incompatible.






      typescript events interface






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited Nov 9 at 13:54

























      asked Nov 8 at 23:33









      AmunRa

      103




      103
























          1 Answer
          1






          active

          oldest

          votes

















          up vote
          0
          down vote



          accepted










          Found the solution here



          By declaring a module with the same name as the imported module, you can augment existing declarations



          import { Observable } from "./observable";
          declare module "./observable" {
          interface Observable<T> {
          map<U>(f: (x: T) => U): Observable<U>;
          }
          }

          Observable.prototype.map = function (f) {
          // ... another exercise for the reader
          }





          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',
            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%2f53217733%2ftypescript-overloading-event-handlers%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








            up vote
            0
            down vote



            accepted










            Found the solution here



            By declaring a module with the same name as the imported module, you can augment existing declarations



            import { Observable } from "./observable";
            declare module "./observable" {
            interface Observable<T> {
            map<U>(f: (x: T) => U): Observable<U>;
            }
            }

            Observable.prototype.map = function (f) {
            // ... another exercise for the reader
            }





            share|improve this answer

























              up vote
              0
              down vote



              accepted










              Found the solution here



              By declaring a module with the same name as the imported module, you can augment existing declarations



              import { Observable } from "./observable";
              declare module "./observable" {
              interface Observable<T> {
              map<U>(f: (x: T) => U): Observable<U>;
              }
              }

              Observable.prototype.map = function (f) {
              // ... another exercise for the reader
              }





              share|improve this answer























                up vote
                0
                down vote



                accepted







                up vote
                0
                down vote



                accepted






                Found the solution here



                By declaring a module with the same name as the imported module, you can augment existing declarations



                import { Observable } from "./observable";
                declare module "./observable" {
                interface Observable<T> {
                map<U>(f: (x: T) => U): Observable<U>;
                }
                }

                Observable.prototype.map = function (f) {
                // ... another exercise for the reader
                }





                share|improve this answer












                Found the solution here



                By declaring a module with the same name as the imported module, you can augment existing declarations



                import { Observable } from "./observable";
                declare module "./observable" {
                interface Observable<T> {
                map<U>(f: (x: T) => U): Observable<U>;
                }
                }

                Observable.prototype.map = function (f) {
                // ... another exercise for the reader
                }






                share|improve this answer












                share|improve this answer



                share|improve this answer










                answered Nov 11 at 0:32









                AmunRa

                103




                103






























                     

                    draft saved


                    draft discarded



















































                     


                    draft saved


                    draft discarded














                    StackExchange.ready(
                    function () {
                    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53217733%2ftypescript-overloading-event-handlers%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