typings(ApplicationCommandOptionData): Align command data options types more with discord API (#6247)

* types(ApplicationCommandData): align command data more with discord API

* types(ApplicationCommandData): clean up type definitions a bit

* types(ApplicationCommandData): fix issue where  could be used with  and

* types(ApplicationCommandOptionData): make subcommand option stronger

* test(ApplicationCommandOptionData): add typing tests
This commit is contained in:
Suneet Tipirneni
2021-08-12 10:05:41 -04:00
committed by GitHub
parent fff887b2f4
commit 297a9118e7
2 changed files with 93 additions and 8 deletions

59
typings/index.d.ts vendored
View File

@@ -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;

View File

@@ -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<ApplicationCommandSubCommandData[] | undefined>(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<Promise<Collection<Snowflake, ApplicationCommand>>>(guildApplicationCommandManager.fetch());
assertType<Promise<Collection<Snowflake, ApplicationCommand>>>(guildApplicationCommandManager.fetch(undefined, {}));