Declaring events in a TypeScript class which extends EventEmitter

前端 未结 4 1480
有刺的猬
有刺的猬 2021-01-01 11:20

I have a class extends EventEmitter that can emit event hello. How can I declare the on method with specific event name and listener s

4条回答
  •  时光说笑
    2021-01-01 11:51

    to extend @SergeyK's answer, with this you can get type-checking and completion on both emit and on functions without repeating event types.

    1. Define event listener signatures for each event type:
    interface MyClassEvents {
      'add': (el: string, wasNew: boolean) => void;
      'delete': (changedCount: number) => void;
    }
    
    1. Declare interface which constructs types for MyClass, based on EventListeners (MyClassEvents) function signature:
    declare interface MyClass {
      on(
        event: U, listener: MyClassEvents[U]
      ): this;
    
      emit(
        event: U, ...args: Parameters
      ): boolean;
    }
    
    1. Simply define you class extending EventEmitter:
    class MyClass extends EventEmitter {
      constructor() {
        super();
      }
    }
    

    Now you will get type checking for on and emit functions:

    Unfortunately you will get completion and type-checking only on those two functions (unless you define more functions inside MyClass interface).

    To get more generic solution, you can use this package. note: it adds no runtime overhead.

    import { TypedEmitter } from 'tiny-typed-emitter';
    
    interface MyClassEvents {
      'add': (el: string, wasNew: boolean) => void;
      'delete': (changedCount: number) => void;
    }
    
    class MyClass extends TypedEmitter {
      constructor() {
        super();
      }
    }
    

提交回复
热议问题