Skip to content

Instantly share code, notes, and snippets.

@AspireOne
Created October 1, 2024 21:03
Show Gist options
  • Save AspireOne/9721f343d250528f17ac22973113a962 to your computer and use it in GitHub Desktop.
Save AspireOne/9721f343d250528f17ac22973113a962 to your computer and use it in GitHub Desktop.
Typed events in typescript
type EventMap = {
loadMore: { lastMessage: sting };
};
class TypedEventTarget<T extends Record<string, any>> {
private listeners: Partial<{ [K in keyof T]: ((event: T[K]) => void)[] }> = {};
addEventListener<K extends keyof T>(type: K, listener: (event: T[K]) => void) {
if (!this.listeners[type]) {
this.listeners[type] = [];
}
this.listeners[type]!.push(listener);
}
removeEventListener<K extends keyof T>(type: K, listener: (event: T[K]) => void) {
if (!this.listeners[type]) return;
this.listeners[type] = this.listeners[type]!.filter((l) => l !== listener);
}
dispatchEvent<K extends keyof T>(type: K, event: T[K]) {
if (!this.listeners[type]) return;
this.listeners[type]!.forEach((listener) => listener(event));
}
}
export const chatEvents = new TypedEventTarget<EventMap>();
@AspireOne
Copy link
Author

chatEvents.dispatchEvent("loadMore", { lastMessage: "somemessageid" });

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment