joker-events
v1.0.1
Published
A simple Event Emitter lib
Downloads
28
Readme
Joker Events - Типизированное управление кастомными событиями
Библиотека для создания типизированной системы управления кастомными событиями с возможностью расширения.
Архитектура
Базовый класс BaseCustomEventsManager
Абстрактный класс, который предоставляет базовый API для работы с событиями:
emit<K>(eventType: K, data: T[K])- отправка событияon<K>(eventType: K, handler)- подписка на событиеoff<K>(eventType: K, handler)- отписка от события
Простой класс CustomEventsManager
Наследник базового класса для использования без дополнительной типизации.
Использование
1. Базовое использование
import { customEvents } from './index';
// Отправка любого события
customEvents.emit('my-event', { data: 'any' });
// Подписка на событие
customEvents.on('my-event', (event) => {
console.log(event.detail);
});2. Расширение с типизацией
import { BaseCustomEventsManager } from './index';
// Определяем типы событий
interface MyEventTypes {
'user:login': { userId: string; timestamp: number };
'user:logout': undefined;
'data:update': { data: any[] };
}
// Создаем расширенный класс
class MyEventsManager extends BaseCustomEventsManager<MyEventTypes> {
private static instance: MyEventsManager;
private constructor() {
super();
}
public static getInstance(): MyEventsManager {
if (!MyEventsManager.instance) {
MyEventsManager.instance = new MyEventsManager();
}
return MyEventsManager.instance;
}
// Добавляем удобные методы
public userLogin(userId: string): boolean {
return this.emit('user:login', {
userId,
timestamp: Date.now()
});
}
public userLogout(): boolean {
return this.emit('user:logout', undefined);
}
}
export const myEvents = MyEventsManager.getInstance();3. Использование расширенного класса
import { myEvents } from './my-events';
// Типизированные методы
myEvents.userLogin('user123');
myEvents.userLogout();
// Прямое использование emit с типизацией
myEvents.emit('data:update', { data: [1, 2, 3] });
// Подписка с автокомплитом и типизацией
myEvents.on('user:login', (event) => {
// event.detail имеет тип { userId: string; timestamp: number }
console.log(`User ${event.detail.userId} logged in at ${event.detail.timestamp}`);
});Преимущества
- Типизация - полная поддержка TypeScript с автокомплитом
- Расширяемость - легко создавать специализированные классы
- Безопасность - типы событий проверяются на этапе компиляции
- Singleton - каждый класс имеет свой экземпляр
- Производительность - использует нативные DOM события
Структура проекта
src/
├── index.ts # Базовые классы
├── example-usage.ts # Пример расширения для приложения
├── usage-example.ts # Демонстрация использования
└── README.md # Документация
``` # joker-events