From e8b69974dcb0e97773679eac04ed0d8918d0c451 Mon Sep 17 00:00:00 2001 From: Suneet Tipirneni <77477100+suneettipirneni@users.noreply.github.com> Date: Sat, 16 Oct 2021 18:19:49 -0400 Subject: [PATCH] types(CommandInteractionOptionResolver): allow narrowing of `getMember()` (#6831) --- typings/index.d.ts | 22 +++++++++++++++++----- typings/tests.ts | 13 ++++++++++++- 2 files changed, 29 insertions(+), 6 deletions(-) diff --git a/typings/index.d.ts b/typings/index.d.ts index 6feb74196cee..d2bb8759b943 100644 --- a/typings/index.d.ts +++ b/typings/index.d.ts @@ -602,12 +602,17 @@ export abstract class Collector extends EventEmi public once(event: 'end', listener: (collected: Collection, reason: string) => Awaitable): this; } -export class CommandInteraction extends BaseCommandInteraction { - public options: CommandInteractionOptionResolver; +export type GuildCommandInteraction = InteractionResponses & + CommandInteraction; + +export class CommandInteraction extends BaseCommandInteraction { + public options: CommandInteractionOptionResolver; + public inCachedGuild(): this is GuildCommandInteraction<'cached'> & this; + public inRawGuild(): this is GuildCommandInteraction<'raw'> & this; public toString(): string; } -export class CommandInteractionOptionResolver { +export class CommandInteractionOptionResolver { private constructor(client: Client, options: CommandInteractionOption[], resolved: CommandInteractionResolvedData); public readonly client: Client; public readonly data: readonly CommandInteractionOption[]; @@ -647,8 +652,14 @@ export class CommandInteractionOptionResolver { public getNumber(name: string, required?: boolean): number | null; public getUser(name: string, required: true): NonNullable; public getUser(name: string, required?: boolean): NonNullable | null; - public getMember(name: string, required: true): NonNullable; - public getMember(name: string, required?: boolean): NonNullable | null; + public getMember( + name: string, + required: true, + ): CacheTypeReducer>; + public getMember( + name: string, + required?: boolean, + ): CacheTypeReducer> | null; public getRole(name: string, required: true): NonNullable; public getRole(name: string, required?: boolean): NonNullable | null; public getMentionable( @@ -1086,6 +1097,7 @@ export interface GuildInteraction; readonly guild: CacheTypeReducer; channel: CacheTypeReducer | null>; + isCommand(): this is GuildCommandInteraction & this; } export class Interaction extends Base { diff --git a/typings/tests.ts b/typings/tests.ts index 03aa9898be78..4f397f2873ef 100644 --- a/typings/tests.ts +++ b/typings/tests.ts @@ -1,4 +1,9 @@ -import { APIGuildMember, APIInteractionGuildMember, APIMessage } from 'discord-api-types/v9'; +import { + APIGuildMember, + APIInteractionDataResolvedGuildMember, + APIInteractionGuildMember, + APIMessage, +} from 'discord-api-types/v9'; import { ApplicationCommand, ApplicationCommandChannelOptionData, @@ -943,8 +948,12 @@ client.on('interactionCreate', async interaction => { consumeCachedCommand(interaction); assertType(interaction); assertType>(interaction.reply({ fetchReply: true })); + assertType(interaction.options.getMember('test')); + assertType(interaction.options.getMember('test', true)); } else if (interaction.inCachedGuild()) { consumeCachedCommand(interaction); + assertType(interaction.options.getMember('test', true)); + assertType(interaction.options.getMember('test')); assertType(interaction); assertType>(interaction.reply({ fetchReply: true })); } else { @@ -952,6 +961,8 @@ client.on('interactionCreate', async interaction => { consumeCachedCommand(interaction); assertType(interaction); assertType>(interaction.reply({ fetchReply: true })); + assertType(interaction.options.getMember('test')); + assertType(interaction.options.getMember('test', true)); } assertType(interaction);