import type { Awaitable, ClientEvents, CommandInteractionOptionResolver } from 'discord.js'; import type { EventEmitter } from 'events'; export type Nullish = T | undefined | null; // Thanks @cursorsdottsx export type ParseType = { [K in keyof T]: T[K] extends unknown ? [k: K, args: T[K]] : never; }[keyof T]; export type Args = ParseType<{ text: string[]; slash: SlashOptions }>; export type DiscordEvent = ParseType<{ [K in keyof ClientEvents]: (...args: ClientEvents[K]) => Awaitable; }>; export type EventEmitterRegister = [ emitter: EventEmitter, k: string, cb: (...args: unknown[]) => Awaitable, ]; export type SlashOptions = Omit; //https://dev.to/vborodulin/ts-how-to-override-properties-with-type-intersection-554l export type Override = Omit & T2; export type DefinitelyDefined = T & Override; type Reconstruct = T extends Omit ? O & Reconstruct : T; type IsOptional = { [K in keyof T]-?: T[K] extends Required[K] ? false : true; }; export type UnionToIntersection = (T extends unknown ? (x: T) => unknown : never) extends ( x: infer R, ) => unknown ? R : never;