1.5.1 • Published 5 years ago

@elderapo/typed-event-emitter v1.5.1

Weekly downloads
28
License
MIT
Repository
github
Last release
5 years ago

@elderapo/typed-event-emitter

styled with prettier Greenkeeper badge Build Status AppVeyor Coveralls Dev Dependencies FOSSA Status

Strongly typed event emitter with API similar to native EventEmitter.

How to install

yarn add @elderapo/typed-event-emitter
# or
npm install @elderapo/typed-event-emitter

Usage

import { TypedEventEmitter } from "@elderapo/typed-event-emitter";

enum Event {
  SomeEvent0,
  SomeEvent1,
  SomeEvent_StringKey = "lalala"
}

type Events = {
  [Event.SomeEvent0]: string;
  [Event.SomeEvent1]: number;
  [Event.SomeEvent_StringKey]: { name: string; age: number };
};

const ee = new TypedEventEmitter<Events>();

const removeListener0 = ee.on(Event.SomeEvent0, payload => {}); // payload type === string
const removeListener1 = ee.once(Event.SomeEvent1, payload => {}); // payload type === number
const removeListener2 = ee.prependListener(Event.SomeEvent_StringKey, payload => {}); // payload type === { name: string; age: number }
const removeListener3 = ee.prependOnceListener(Event.SomeEvent_StringKey, payload => {}); // payload type === { name: string; age: number }

ee.emit(Event.SomeEvent0, "string"); // ok
ee.emit(Event.SomeEvent0, 1); // wrong type - TS error

ee.emit(Event.SomeEvent1, 666); // ok
ee.emit(Event.SomeEvent1, "aaa"); // wrong type - TS error

ee.emit(Event.SomeEvent_StringKey, { name: "Tomek", age: 123 }); // ok
ee.emit(Event.SomeEvent_StringKey, {}); // wrong type - TS error

removeListener0(); // pretty self explanatory :)
removeListener1();
removeListener2();
removeListener3();

More examples

Cavecats:

import { TypedEventEmitter } from "@elderapo/typed-event-emitter";
import { EventEmitter } from "events";

// some event emitter from external library
const ee = new EventEmitter();

setInterval(() => {
  ee.emit("0"); // <-- notice "0" instead of 0
}, 500);

enum Event {
  SomeEvent // === 0 number
}

type Events = {
  [Event.SomeEvent]: void;
};

const tee = TypedEventEmitter.fromEventEmitter<Events>(ee);

/*
	For EventEmitter "0" and 0 are the same because it uses basic {} as key/value:

	const a = {};
	a[123] = 123;
	a["123"]++;
	a[123] === 124; // true
*/

tee.on(Event.SomeEvent, () => {
  console.log(`Received event!`);
});

License

FOSSA Status