Typed Emitter
A thin typed wrapper around tiny-emitter. Subclasses pin an event-map type so on/once/emit are fully type-safe.
Installation
Usage
Extend TypedEmitter with an event map ({ eventName: payloadType }). Listeners and emits are checked against the map.
import { TypedEmitter } from '@/registry/lib/typed-emitter'
type PlayerEvents = {
play: { time: number }
pause: void
seek: { from: number; to: number }
}
class Player extends TypedEmitter<PlayerEvents> {
start() {
this.emit('play', { time: 0 })
}
stop() {
this.emit('pause', undefined)
}
}
const player = new Player()
const off = player.on('play', ({ time }) => {
console.log('playing from', time)
})
player.start()
off() // unsubscribeAPI
| Method | Signature | Description |
|---|---|---|
on | (event, listener) => () => void | Subscribe to an event. Returns an unsubscribe function. |
once | (event, listener) => void | Subscribe to a single firing of an event. |
off | (event, listener?) => void | Unsubscribe a specific listener, or all listeners for an event when listener is omitted. |
emit | (event, payload) => void | protected — emit an event from the subclass. |
Notes
emitisprotectedon purpose — events are an implementation detail of the subclass, not part of its public surface. Consumers subscribe withon/once/offand let the class decide when to fire.- The unsubscribe function returned by
onis the recommended way to clean up, particularly insideuseEffect. - For events with no payload, type the value as
voidand passundefinedwhen emitting.