1.5.1 • Published 5 years ago
@elderapo/typed-event-emitter v1.5.1
@elderapo/typed-event-emitter
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!`);
});