@amandaghassaei/event-dispatcher
TypeScript icon, indicating that this package has built-in type declarations

2.0.1 • Public • Published

@amandaghassaei/event-dispatcher

NPM Package Build Size NPM Downloads License

Parent class to support custom event listeners.

  • Written in TypeScript with exported type declarations.
  • Includes unit tests with 100% coverage.

Table of Contents:

Installation

Install via NPM

npm install @amandaghassaei/event-dispatcher

Then import via:

import { EventDispatcherPrototype } from '@amandaghassaei/event-dispatcher';

Use

See full API documentation in docs/.

import { EventDispatcher, Listener } from '../src/index';

// Define events and class event types.
const ADDED_EVENT = 'ADDED_EVENT';
const CHANGE_EVENT = 'CHANGE_EVENT';
const FINISHED_EVENT = 'FINISHED_EVENT';
const REMOVED_EVENT = 'REMOVED_EVENT';
type MyClassEventType =
    | typeof ADDED_EVENT
    | typeof CHANGE_EVENT
    | typeof FINISHED_EVENT
    | typeof REMOVED_EVENT;

// Create an EventDispatcher subclass.
// Use function overloads to define correct typing of subclass event/listener pairs.
// Event listeners may accept an optional parameter.
class MyClass extends EventDispatcher<MyClassEventType> {
    addOneTimeEventListener(type: typeof ADDED_EVENT, listener: () => void): void;
    addOneTimeEventListener(type: typeof REMOVED_EVENT, listener: () => void): void;
    addOneTimeEventListener<S extends MyClassEventType>(type: S, listener: () => void) {
        super.addOneTimeEventListener(type, listener);
    }

    addEventListener(type: typeof CHANGE_EVENT, listener: (object: MyClass) => void): void;
    addEventListener(type: typeof FINISHED_EVENT, listener: (object: MyClass) => void): void;
    addEventListener<S extends MyClassEventType>(type: S, listener: Listener) {
        super.addEventListener(type, listener);
    }

    removeEventListener(type: typeof CHANGE_EVENT, listener: (object: MyClass) => void): void;
    removeEventListener(type: typeof FINISHED_EVENT, listener: (object: MyClass) => void): void;
    removeEventListener<S extends MyClassEventType>(type: S, listener: Listener) {
        super.removeEventListener(type, listener);
    }

    // You may decide to make dispatchEvent a protected function,
    // which can only be called from within the subclass.
    protected _dispatchEvent(type: typeof CHANGE_EVENT, object: MyClass): void;
    protected _dispatchEvent(type: typeof FINISHED_EVENT, object: MyClass): void;
    protected _dispatchEvent(type: typeof REMOVED_EVENT): void;
    protected _dispatchEvent<S extends MyClassEventType>(type: S, object?: any) {
        super._dispatchEvent(type, object);
    }
}

const instance = new MyClass();
instance.addEventListener(CHANGE_EVENT, (object) => {
    console.log('instance changed:', object);
});

// The following will throw type errors:

// REMOVED_EVENT is not a valid event type for MyClass.addEventListener().
// instance.addEventListener(REMOVED_EVENT, (object) => {});

// The object parameter must be of type MyClass.
// instance.addEventListener(CHANGE_EVENT, (object: number) => {});

License

This work is distributed under an MIT license. It has no dependencies.

Acknowledgements

Inspired by Three.js's EventDispatcher class.

Development

Install dev-dependencies:

npm install

Build from src to dist and compile docs:

npm run build

Test with code coverage:

npm run test-with-coverage

Package Sidebar

Install

npm i @amandaghassaei/event-dispatcher

Weekly Downloads

2

Version

2.0.1

License

MIT

Unpacked Size

19 kB

Total Files

7

Last publish

Collaborators

  • amandaghassaei