typed-event-dispatcher

Strongly-typed events that can be publicly listened but internally-only dispatched.

Usage no npm install needed!

<script type="module">
  import typedEventDispatcher from 'https://cdn.skypack.dev/typed-event-dispatcher';
</script>

README

Typed Event Dispatcher

NPM Version Build Status Coverage Status License

Strongly-typed events that can be publicly listened but internally-only dispatched.

A lightweight, fully-tested and dependency-free lib made for Typescript (see live example) and JavaScript (see live example) codebases.

Install

npm install typed-event-dispatcher

Import

// Import as an ES Module.
import { TypedEventDispatcher } from "typed-event-dispatcher";
// Or require as a CommonJS Module.
const { TypedEventDispatcher } = require("typed-event-dispatcher");
// Or import it from URL.
import { TypedEventDispatcher } from "https://esm.sh/typed-event-dispatcher";
<!-- Or use it directly in the browser. -->
<script src="https://unpkg.com/typed-event-dispatcher"></script>
<script>
  const { TypedEventDispatcher } = window["typed-event-dispatcher"];
</script>

Usage

class Counter {
  // 1️⃣ Create a private event dispatcher.
  private onCountIncreasedDispatcher = new TypedEventDispatcher<number>();

  // 2️⃣ Create a public event getter.
  public get onCountIncreased() {
    return this.onCountIncreasedDispatcher.getter;
  }

  public increaseCountOncePerSecond() {
    setInterval(() => {
      this.increaseCount();

      // 3️⃣ Dispatch the event so listeners can react to it.
      this.onCountIncreasedDispatcher.dispatch(this.count);
    }, 1000);
  }

  private count = 0;

  private increaseCount() {
    this.count++;
  }
}

class Example {
  private counter = new Counter();

  public start() {
    console.log("Starting count...");

    // 4️⃣ Listen to events dispatched by other classes.
    this.counter.onCountIncreased.addListener((count) => {
      console.log(`Count increased to ${count}.`);
    });

    this.counter.increaseCountOncePerSecond();
  }
}

new Example().start();

And here's a simplified version of the example above:

function createCounter() {
  let count = 0;
  const { dispatch, getter } = new TypedEventDispatcher(count);
  const increaseCount = () => dispatch(++count);
  return { increaseCount, countIncreasedEvent: getter };
}

function startExample() {
  const { increaseCount, countIncreasedEvent } = createCounter();
  console.log("Starting count...");
  countIncreasedEvent.addListener((count) =>
    console.log(`Count increased to ${count}.`)
  );
  setInterval(increaseCount, 1000);
}

startExample();

Further Reading

For more details about how to use this lib, please refer to the Usage Overview.

Check also the Online Documentation. Or generate it locally by running npm run docs.

Although all you need to know is only two definitions: