diff --git a/typings/index.d.ts b/typings/index.d.ts index b253db239..f911ac4fc 100644 --- a/typings/index.d.ts +++ b/typings/index.d.ts @@ -2898,6 +2898,33 @@ export interface BaseApplicationCommandData { defaultPermission?: boolean; } +export type CommandOptionDataTypeResolvable = ApplicationCommandOptionType | ApplicationCommandOptionTypes; + +export type CommandOptionChoiceResolvableType = + | ApplicationCommandOptionTypes.NUMBER + | 'NUMBER' + | ApplicationCommandOptionTypes.STRING + | 'STRING' + | ApplicationCommandOptionTypes.INTEGER + | 'INTEGER'; + +export type CommandOptionSubOptionResolvableType = + | ApplicationCommandOptionTypes.SUB_COMMAND + | 'SUB_COMMAND' + | ApplicationCommandOptionTypes.SUB_COMMAND_GROUP + | 'SUB_COMMAND_GROUP'; + +export type CommandOptionNonChoiceResolvableType = Exclude< + CommandOptionDataTypeResolvable, + CommandOptionChoiceResolvableType | CommandOptionSubOptionResolvableType +>; + +export interface BaseApplicationCommandOptionsData { + name: string; + description: string; + required?: boolean; +} + export interface UserApplicationCommandData extends BaseApplicationCommandData { type: 'USER' | ApplicationCommandTypes.USER; } @@ -2917,19 +2944,35 @@ export type ApplicationCommandData = | MessageApplicationCommandData | ChatInputApplicationCommandData; -export interface ApplicationCommandOptionData { - type: ApplicationCommandOptionType | ApplicationCommandOptionTypes; - name: string; - description: string; - required?: boolean; +export interface ApplicationCommandChoicesData extends BaseApplicationCommandOptionsData { + type: CommandOptionChoiceResolvableType; choices?: ApplicationCommandOptionChoice[]; - options?: ApplicationCommandOptionData[]; } -export interface ApplicationCommandOption extends ApplicationCommandOptionData { +export interface ApplicationCommandSubGroupData extends BaseApplicationCommandOptionsData { + type: 'SUB_COMMAND_GROUP' | ApplicationCommandOptionTypes.SUB_COMMAND_GROUP; + options?: ApplicationCommandSubCommandData[]; +} + +export interface ApplicationCommandSubCommandData extends BaseApplicationCommandOptionsData { + type: 'SUB_COMMAND' | ApplicationCommandOptionTypes.SUB_COMMAND; + options?: (ApplicationCommandChoicesData | ApplicationCommandNonOptionsData)[]; +} + +export interface ApplicationCommandNonOptionsData extends BaseApplicationCommandOptionsData { + type: CommandOptionNonChoiceResolvableType; +} + +export type ApplicationCommandOptionData = + | ApplicationCommandSubGroupData + | ApplicationCommandNonOptionsData + | ApplicationCommandChoicesData + | ApplicationCommandSubCommandData; + +export type ApplicationCommandOption = ApplicationCommandOptionData & { type: ApplicationCommandOptionType; options?: ApplicationCommandOption[]; -} +}; export interface ApplicationCommandOptionChoice { name: string; diff --git a/typings/tests.ts b/typings/tests.ts index 663b6c621..d9b67ddd8 100644 --- a/typings/tests.ts +++ b/typings/tests.ts @@ -1,8 +1,13 @@ import { ApplicationCommand, + ApplicationCommandChoicesData, ApplicationCommandData, ApplicationCommandManager, + ApplicationCommandNonOptionsData, + ApplicationCommandOptionData, ApplicationCommandResolvable, + ApplicationCommandSubCommandData, + ApplicationCommandSubGroupData, CacheFactory, Caches, CategoryChannel, @@ -13,6 +18,8 @@ import { CommandInteraction, CommandInteractionOption, CommandInteractionOptionResolver, + CommandOptionChoiceResolvableType, + CommandOptionNonChoiceResolvableType, Constants, DMChannel, Guild, @@ -56,6 +63,7 @@ import { User, VoiceChannel, } from '.'; +import { ApplicationCommandOptionTypes, ApplicationCommandTypes } from './enums'; const client: Client = new Client({ intents: Intents.FLAGS.GUILDS, @@ -628,6 +636,40 @@ declare const applicationCommandManager: ApplicationCommandManager; ); } +declare const applicationNonChoiceOptionData: ApplicationCommandOptionData & { + type: CommandOptionNonChoiceResolvableType; +}; +{ + // Options aren't allowed on this command type. + + // @ts-expect-error + applicationNonChoiceOptionData.choices; +} + +declare const applicationChoiceOptionData: ApplicationCommandOptionData & { type: CommandOptionChoiceResolvableType }; +{ + // Choices should be available. + applicationChoiceOptionData.choices; +} + +declare const applicationSubGroupCommandData: ApplicationCommandSubGroupData; +{ + assertType<'SUB_COMMAND_GROUP' | ApplicationCommandOptionTypes.SUB_COMMAND_GROUP>( + applicationSubGroupCommandData.type, + ); + assertType(applicationSubGroupCommandData.options); +} + +declare const applicationSubCommandData: ApplicationCommandSubCommandData; +{ + assertType<'SUB_COMMAND' | ApplicationCommandOptionTypes.SUB_COMMAND>(applicationSubCommandData.type); + + // Check that only subcommands can have no subcommand or subcommand group sub-options. + assertType<(ApplicationCommandChoicesData | ApplicationCommandNonOptionsData)[] | undefined>( + applicationSubCommandData.options, + ); +} + declare const guildApplicationCommandManager: GuildApplicationCommandManager; assertType>>(guildApplicationCommandManager.fetch()); assertType>>(guildApplicationCommandManager.fetch(undefined, {}));