strict-event-emitter

Type-safe implementation of EventEmitter for browser and Node.js

MIT 22 个版本
安装
npm install strict-event-emitter
yarn add strict-event-emitter
pnpm add strict-event-emitter
bun add strict-event-emitter
README

Strict Event Emitter

A type-safe implementation of EventEmitter for browser and Node.js.

Motivation

Despite event emitters potentially accepting any runtime value, defining a strict event contract is crucial when developing complex event-driven architectures. Unfortunately, the native type definitions for Node's EventEmitter annotate event names as string, which forbids any stricter type validation.

// index.js
const emitter = new EventEmitter()

// Let's say our application expects a "ping"
// event with the number payload.
emitter.on('ping', (n: number) => {})

// We can, however, emit a different event by mistake.
emitter.emit('pong', 1)

// Or even the correct event with the wrong data.
emitter.emit('ping', 'wait, not a number')

The purpose of this library is to provide an EventEmitter instance that can accept a generic describing the expected events contract.

import { Emitter } from 'strict-event-emitter'

// Define a strict events contract where keys
// represent event names and values represent
// the list of arguments expected in ".emit()".
type Events = {
  ping: [number]
}

const emitter = new Emitter<Events>()
emitter.addListener('ping', (n) => {
  // "n" argument type is inferred as "number'.
})

emitter.emit('ping', 10) // OK
emitter.emit('unknown', 10) // TypeError (invalid event name)
emitter.emit('ping', 'wait, not a number') // TypeError (invalid data)

This library is also a custom EventEmitter implementation, which makes it compatible with other environments, like browsers or React Native.

Getting started

Install

npm install strict-event-emitter

Use

import { Emitter } from 'strict-event-emitter'

// 1. Define an interface that describes your events.
// Set event names as the keys, and their expected payloads as values.
interface Events {
  connect: [id: string]
  disconnect: [id: string]
}

// 2. Create a strict emitter and pass the previously defined "Events"
// as its first generic argument.
const emitter = new Emitter<Events>()

// 3. Use the "emitter" the same way you'd use the regular "EventEmitter" instance.
emitter.addListener('connect', (id) => {})
emitter.emit('connect', 'abc-123')

License

MIT

版本列表
0.5.1 2023-09-21
0.5.0 2023-03-21
0.4.6 2023-02-05
0.4.5 2023-02-05
0.4.4 2023-01-20
0.4.3 2022-12-21
0.4.2 2022-12-21
0.4.1 2022-12-21
0.4.0 2022-12-21
0.3.2 2022-12-21
0.3.1 2022-12-20
0.3.0 2022-12-20
0.2.8 2022-10-18
0.2.7 2022-10-07
0.2.6 2022-10-01
0.2.5 2022-09-27
0.2.4 2022-03-31
0.2.3 2022-03-31
0.2.2 2022-03-31
0.2.1 2022-03-31
0.2.0 2021-03-01
0.1.0 2020-12-17