I am trying to spread function arguments in a position where varying arguments are accepted:
interface ClientEvents {
ready: [client: string]
interactionCreate: [interaction: number]
}
declare class Client {
public on<K extends keyof ClientEvents>(event: K, listener: (...args: ClientEvents[K]) => Awaited<void>): this;
public on<S extends string | symbol>(
event: Exclude<S, keyof ClientEvents>,
listener: (...args: any[]) => Awaited<void>,
): this;
public once<K extends keyof ClientEvents>(event: K, listener: (...args: ClientEvents[K]) => Awaited<void>): this;
public once<S extends string | symbol>(
event: Exclude<S, keyof ClientEvents>,
listener: (...args: any[]) => Awaited<void>,
): this;
}
type MyEvent<T extends keyof ClientEvents> = {
name: T,
execute: (...args: [...args: ClientEvents[T], commands: string]) => Awaited<void>
}
declare const readyEvent: MyEvent<"ready">
declare const interactionCreateEvent: MyEvent<"interactionCreate">
declare const events: {
ready: typeof readyEvent,
interactionCreate: typeof interactionCreateEvent
}
declare const client: Client
Object.values(events).forEach((event) =>
client[event.name === "ready" ? "once" : "on"](event.name, (...args) =>
event.execute(...args, "test")
)
)
This errors with:
(parameter) args: [client: string] | [interaction: number]
Argument of type 'string | number' is not assignable to parameter of type 'never'.
Type 'string' is not assignable to type 'never'.
How would I solve this? ClientEvents
and Client
are library types in reality so I can only control the rest of the code