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; 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 { export interface UserApplicationCommandData extends BaseApplicationCommandData {
type: 'USER' | ApplicationCommandTypes.USER; type: 'USER' | ApplicationCommandTypes.USER;
} }
@@ -2917,19 +2944,35 @@ export type ApplicationCommandData =
| MessageApplicationCommandData | MessageApplicationCommandData
| ChatInputApplicationCommandData; | ChatInputApplicationCommandData;
export interface ApplicationCommandOptionData { export interface ApplicationCommandChoicesData extends BaseApplicationCommandOptionsData {
type: ApplicationCommandOptionType | ApplicationCommandOptionTypes; type: CommandOptionChoiceResolvableType;
name: string;
description: string;
required?: boolean;
choices?: ApplicationCommandOptionChoice[]; 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; type: ApplicationCommandOptionType;
options?: ApplicationCommandOption[]; options?: ApplicationCommandOption[];
} };
export interface ApplicationCommandOptionChoice { export interface ApplicationCommandOptionChoice {
name: string; name: string;

View File

@@ -1,8 +1,13 @@
import { import {
ApplicationCommand, ApplicationCommand,
ApplicationCommandChoicesData,
ApplicationCommandData, ApplicationCommandData,
ApplicationCommandManager, ApplicationCommandManager,
ApplicationCommandNonOptionsData,
ApplicationCommandOptionData,
ApplicationCommandResolvable, ApplicationCommandResolvable,
ApplicationCommandSubCommandData,
ApplicationCommandSubGroupData,
CacheFactory, CacheFactory,
Caches, Caches,
CategoryChannel, CategoryChannel,
@@ -13,6 +18,8 @@ import {
CommandInteraction, CommandInteraction,
CommandInteractionOption, CommandInteractionOption,
CommandInteractionOptionResolver, CommandInteractionOptionResolver,
CommandOptionChoiceResolvableType,
CommandOptionNonChoiceResolvableType,
Constants, Constants,
DMChannel, DMChannel,
Guild, Guild,
@@ -56,6 +63,7 @@ import {
User, User,
VoiceChannel, VoiceChannel,
} from '.'; } from '.';
import { ApplicationCommandOptionTypes, ApplicationCommandTypes } from './enums';
const client: Client = new Client({ const client: Client = new Client({
intents: Intents.FLAGS.GUILDS, 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; declare const guildApplicationCommandManager: GuildApplicationCommandManager;
assertType<Promise<Collection<Snowflake, ApplicationCommand>>>(guildApplicationCommandManager.fetch()); assertType<Promise<Collection<Snowflake, ApplicationCommand>>>(guildApplicationCommandManager.fetch());
assertType<Promise<Collection<Snowflake, ApplicationCommand>>>(guildApplicationCommandManager.fetch(undefined, {})); assertType<Promise<Collection<Snowflake, ApplicationCommand>>>(guildApplicationCommandManager.fetch(undefined, {}));