feat: add typeguard to BaseInteraction#isRepliable (#8565)

* feat: add typeguard to BaseInteraction#isRepliable

* fix: redefine RepliableInteraaction

...to exclude impossible interactions rather than specify possible ones

Co-authored-by: Jiralite <33201955+Jiralite@users.noreply.github.com>

* fix: remove InteractionResponseFields

* fix: replace InteractionResponseFields with RepliableInteraction in index test

Co-authored-by: Jiralite <33201955+Jiralite@users.noreply.github.com>
Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com>
This commit is contained in:
Maksi
2022-09-06 19:56:21 +02:00
committed by GitHub
parent c3341570d9
commit 55c3ee20ae
2 changed files with 5 additions and 26 deletions

View File

@@ -398,28 +398,6 @@ export type GuildCacheMessage<Cached extends CacheType> = CacheTypeReducer<
Message | APIMessage
>;
export interface InteractionResponseFields<Cached extends CacheType = CacheType> {
deferred: boolean;
ephemeral: boolean | null;
replied: boolean;
webhook: InteractionWebhook;
reply(options: InteractionReplyOptions & { fetchReply: true }): Promise<Message>;
reply(options: string | MessagePayload | InteractionReplyOptions): Promise<void>;
deleteReply(): Promise<void>;
editReply(options: string | MessagePayload | WebhookEditMessageOptions): Promise<Message>;
deferReply(options: InteractionDeferReplyOptions & { fetchReply: true }): Promise<Message>;
deferReply(options?: InteractionDeferReplyOptions): Promise<void>;
fetchReply(): Promise<Message>;
followUp(options: string | MessagePayload | InteractionReplyOptions): Promise<Message>;
showModal(
modal:
| JSONEncodable<APIModalInteractionResponseCallbackData>
| ModalComponentData
| APIModalInteractionResponseCallbackData,
): Promise<void>;
awaitModalSubmit(options: AwaitModalSubmitOptions<ModalSubmitInteraction>): Promise<ModalSubmitInteraction<Cached>>;
}
export type BooleanCache<T extends CacheType> = T extends 'cached' ? true : false;
export abstract class CommandInteraction<Cached extends CacheType = CacheType> extends BaseInteraction<Cached> {
@@ -1504,6 +1482,7 @@ export type Interaction<Cached extends CacheType = CacheType> =
| AutocompleteInteraction<Cached>
| ModalSubmitInteraction<Cached>;
export type RepliableInteraction<Cached extends CacheType = CacheType> = Exclude<Interaction, AutocompleteInteraction>;
export class BaseInteraction<Cached extends CacheType = CacheType> extends Base {
// This a technique used to brand different cached types. Or else we'll get `never` errors on typeguard checks.
private readonly _cacheType: Cached;
@@ -1544,7 +1523,7 @@ export class BaseInteraction<Cached extends CacheType = CacheType> extends Base
public isModalSubmit(): this is ModalSubmitInteraction<Cached>;
public isUserContextMenuCommand(): this is UserContextMenuCommandInteraction<Cached>;
public isSelectMenu(): this is SelectMenuInteraction<Cached>;
public isRepliable(): this is this & InteractionResponseFields<Cached>;
public isRepliable(): this is RepliableInteraction<Cached>;
}
export class InteractionCollector<T extends CollectedInteraction> extends Collector<

View File

@@ -100,7 +100,7 @@ import {
ActionRowBuilder,
ButtonComponent,
SelectMenuComponent,
InteractionResponseFields,
RepliableInteraction,
ThreadChannelType,
Events,
WebSocketShardEvents,
@@ -1519,7 +1519,7 @@ client.on('interactionCreate', async interaction => {
}
if (interaction.isRepliable()) {
expectAssignable<InteractionResponseFields>(interaction);
expectAssignable<RepliableInteraction>(interaction);
interaction.reply('test');
}
@@ -1529,7 +1529,7 @@ client.on('interactionCreate', async interaction => {
interaction.isRepliable()
) {
expectAssignable<CommandInteraction>(interaction);
expectAssignable<InteractionResponseFields>(interaction);
expectAssignable<RepliableInteraction>(interaction);
}
});