I want to add custom (typed) events to the Client class.

So i have this class that extends the Client class and it just adds some utilities i use. I want to add a few more events to that extending class. Now usually this would be no problem as I just emit using the already baked-in EventEmitter in the Client class. However, I would like to additionally add typings using the same already integrated system that DJS uses. Is this even possible? FYI, by typings i mean types for the parameters when i listen to an event:
clientV2.on("customEventName", (thisIsTypedAutomatically) => {...});
clientV2.on("customEventName", (thisIsTypedAutomatically) => {...});
5 Replies
d.js toolkit
d.js toolkit5mo ago
- What's your exact discord.js npm list discord.js and node node -v version? - Not a discord.js issue? Check out #other-js-ts. - Consider reading #how-to-get-help to improve your question! - Explain what exactly your issue is. - Post the full error stack trace, not just the top part! - Show your code! - Issue solved? Press the button! - Marked as resolved by OP
Булочка | pasha_boez
It's js related #other-js-ts But aw answer here. You can create your own type based on this
Thorminate
ThorminateOP5mo ago
Fair enough, thanks nonetheless!
Булочка | pasha_boez
You're welcome 🙂
Thorminate
ThorminateOP5mo ago
Some typescript wizardry later, this is the solution I came up with if anyone reading wants it;
import { Client, ClientEvents } from "discord.js"

type NewClientEvents = ClientEvents & {
tick: [currentTime: number];
};

class NewClient extends Client {
...

override on<Event extends keyof NewClientEvents>(
event: Event,
listener: (...args: NewClientEvents[Event]) => void
): this;
override on(event: string, listener: (...args: any[]) => void): this {
super.on(event, listener);
return this;
}

override once<Event extends keyof NewClientEvents>(
event: Event,
listener: (...args: NewClientEvents[Event]) => void
): this;
override once(event: string, listener: (...args: any[]) => void): this {
super.once(event, listener);
return this;
}

override emit<Event extends keyof NewClientEvents>(
event: Event,
...args: NewClientEvents[Event]
): boolean;
override emit(event: string, ...args: any[]): boolean {
return super.emit(event, ...args);
}

override off<Event extends keyof NewClientEvents>(
event: Event,
listener: (...args: NewClientEvents[Event]) => void
): this;
override off(event: string, listener: (...args: any[]) => void): this {
super.off(event, listener);
return this;
}

override removeAllListeners<Event extends keyof NewClientEvents>(
event?: Event
): this;
override removeAllListeners(event?: string): this {
super.removeAllListeners(event);
return this;
}
}
import { Client, ClientEvents } from "discord.js"

type NewClientEvents = ClientEvents & {
tick: [currentTime: number];
};

class NewClient extends Client {
...

override on<Event extends keyof NewClientEvents>(
event: Event,
listener: (...args: NewClientEvents[Event]) => void
): this;
override on(event: string, listener: (...args: any[]) => void): this {
super.on(event, listener);
return this;
}

override once<Event extends keyof NewClientEvents>(
event: Event,
listener: (...args: NewClientEvents[Event]) => void
): this;
override once(event: string, listener: (...args: any[]) => void): this {
super.once(event, listener);
return this;
}

override emit<Event extends keyof NewClientEvents>(
event: Event,
...args: NewClientEvents[Event]
): boolean;
override emit(event: string, ...args: any[]): boolean {
return super.emit(event, ...args);
}

override off<Event extends keyof NewClientEvents>(
event: Event,
listener: (...args: NewClientEvents[Event]) => void
): this;
override off(event: string, listener: (...args: any[]) => void): this {
super.off(event, listener);
return this;
}

override removeAllListeners<Event extends keyof NewClientEvents>(
event?: Event
): this;
override removeAllListeners(event?: string): this {
super.removeAllListeners(event);
return this;
}
}

Did you find this page helpful?