1.0.2 • Published 3 years ago

@kotofurumiya/typed-emitter v1.0.2

Weekly downloads
-
License
Zlib
Repository
github
Last release
3 years ago

typed-emitter

Strongly typed simple event emitter with zero dependencies. It works on arbitrary JS engines.

Support

EnvVersionStatus
Node.js12.xnever
Node.js14.xok
Node.js16.xok
Browserlatestok

Install

npm i @kotofurumiya/typed-emitter

API Reference

See API Document.

Overview

Without types.

import { Emitter } from '@kotofurumiya/typed-emitter';

const emitter = new Emitter();
const listener = (event) => console.log(event);
emitter.listen('myevent', listener);
emitter.listen('myawesomeevent', listener, { once: true });
emitter.emit('myevent', { name: 'John' });
emitter.unlisten(listener);

With types.

import { Emitter } from '@kotofurumiya/typed-emitter';

// define `eventName: eventType` record type.
type MyEventMap = {
  foo: string;
  bar: {
    name: string;
  }
};

// apply it
const emitter = new Emitter<MyEventMap>();

// ok and types are inferred automatically
emitter.listen('foo', (val) => console.log(val));
emitter.listen('bar', ({name}) => console.log(name));

// type mismatch error
emitter.listen('foo', ({ zzz }) => console.log(zzz));
emitter.listen('bar', ({name}) => console.log(name));

// type error('awesome' event does not exists)
emitter.listen('awesome', (event) => console.log(event));

// ok to emit event
emitter.emit('foo', 'hello!');
emitter.emit('bar', { name: 'John' });

// type mismatch error
emitter.emit('foo', 123);
emitter.emit('bar', true);

Basic Usage

Usually, you want to use a emitter with extends. It's possible of course.

class GameEnemy extends Emitter<GameEvent> {
  constructor() {
    // `super()` in constructor is required. Don't forget.
    super();
  }
};

But to simplify explanation, I'll use bare Emitter here.

It's very simple to use Emitter. Just listen and emit, it's all.

import { Emitter } from '@kotofurumiya/typed-emitter';

const emitter = new Emitter();
const listener = (event) => console.log(event);
emitter.listen('myevent', listener);
emitter.listen('myawesomeevent', listener, { once: true });
emitter.emit('myevent', { name: 'John' });
emitter.unlisten(listener);

These methods are strongly typed. If you give definition of "events" to Emitter, your text editor can suggest and lint wisely.

import { Emitter } from '@kotofurumiya/typed-emitter';

const emitter = new Emitter<{ foo: string }>();

// error! 'foo' must emit `string`
emitter.emit('foo', 123);

If you don't need type checks, you can omit it.

// with type check
const emitter = new Emitter<{ foo: string }>();

// without type check
const emitter = new Emitter();

Advanced Usage

Once listener

You can register a listener as "once" listener by passing { once: true } to listen method.

"once" listener will be automatically removed after event is fired.

emitter.listen('myevent', listener, { once: true });

once listeners can be removed with emitter.unlisten.

emitter.listen('myevent', listener, { once: true });
emitter.unlisten('myevent', listener);

Unlisten function

listen method returns a unlitening function. This function is same as emitter.unlisten(eventName, listener).

const unlisten = emitter.listen('myevent', listener);
unlisten(); // same as `emitter.unlisten('myevent', listener)`

If you want to prune all listeners, you can use unlistenAllOf.

// Remove all 'myevent' listeners, includes once listeners.
emitter.unlistenAllOf('myevent');