/tyde

Typed event emitter

Primary LanguageTypeScriptMIT LicenseMIT

@susisu/tyde

CI

Typed event emitter

Installation

npm i @susisu/tyde
# or
yarn add @susisu/tyde

Usage

tyde provides API that is similar to EventEmitter and event-kit.

The simplest usage is subscribing events with .on() and emitting events with .emit().

import { Emitter } from "@susisu/tyde";

const emitter = new Emitter();

const subscription = emitter.on("change", value => {
  console.log(value);
});

emitter.emit("change", 42); // -> 42

Subscriptions can be unsubscribed by calling .unsubscribe().

subscription.unsubscribe();
emitter.emit("change", 0); // no output

The curried version of .on() is also available.

const onChange = emitter.on("change");
const subscription = onChange(value => { /* ... */ });

You can optionally restrict types of emitted values by giving a dictionary to Emitter's type parameter.

const emitter = new Emitter<{
  "change": number,
  "destroy": void,
}>();

emitter.emit("change", 42);     // ok
emitter.emit("destroy");        // ok
emitter.emit("foo", 42);        // type error: unknown event
emitter.emit("change", "test"); // type error: mismatched type

Difference from other event emitters

By design, tyde has some difference from other event emitter libraries:

  • No wildcards, because of the strongly typed interface.
  • Events are emitted asynchronously by default.
    • Usually event handlers should not care whether it is called synchronously or asynchronously.
    • There is also a synchronous version .emitSync(), but it is not always recommended.
  • Invocation order of event handlers is not guaranteed in any way.
    • Specifying execution order in a less explicit way will lower the readability of code.
    • If you still want one, invoke multiple functions in one event handler, or separate the event into multiple stages.

License

MIT License

Author

Susisu (GitHub, Twitter)