types: don't allow any object in the first parameter if second parameter is not given in TextBasedChannel#send (#4736)

This commit is contained in:
cherryblossom000
2020-08-29 20:08:04 +10:00
committed by GitHub
parent 74ebb650df
commit 74763ef3fb
2 changed files with 75 additions and 41 deletions

89
typings/index.d.ts vendored
View File

@@ -60,14 +60,26 @@ declare module 'discord.js' {
public static create( public static create(
target: MessageTarget, target: MessageTarget,
content?: StringResolvable, content: APIMessageContentResolvable,
options?: MessageOptions | WebhookMessageOptions | MessageAdditions, options?: undefined,
extra?: MessageOptions | WebhookMessageOptions,
): APIMessage;
public static create(
target: MessageTarget,
content: StringResolvable,
options: MessageOptions | WebhookMessageOptions | MessageAdditions,
extra?: MessageOptions | WebhookMessageOptions, extra?: MessageOptions | WebhookMessageOptions,
): APIMessage; ): APIMessage;
public static partitionMessageAdditions( public static partitionMessageAdditions(
items: readonly (MessageEmbed | MessageAttachment)[], items: readonly (MessageEmbed | MessageAttachment)[],
): [MessageEmbed[], MessageAttachment[]]; ): [MessageEmbed[], MessageAttachment[]];
public static resolveFile(fileLike: BufferResolvable | Stream | FileOptions | MessageAttachment): Promise<object>; public static resolveFile(fileLike: BufferResolvable | Stream | FileOptions | MessageAttachment): Promise<object>;
public static transformOptions(
content: APIMessageContentResolvable,
options?: undefined,
extra?: MessageOptions | WebhookMessageOptions,
isWebhook?: boolean,
): MessageOptions | WebhookMessageOptions;
public static transformOptions( public static transformOptions(
content: StringResolvable, content: StringResolvable,
options: MessageOptions | WebhookMessageOptions | MessageAdditions, options: MessageOptions | WebhookMessageOptions | MessageAdditions,
@@ -995,33 +1007,29 @@ declare module 'discord.js' {
): Promise<Collection<Snowflake, MessageReaction>>; ): Promise<Collection<Snowflake, MessageReaction>>;
public createReactionCollector(filter: CollectorFilter, options?: ReactionCollectorOptions): ReactionCollector; public createReactionCollector(filter: CollectorFilter, options?: ReactionCollectorOptions): ReactionCollector;
public delete(options?: { timeout?: number; reason?: string }): Promise<Message>; public delete(options?: { timeout?: number; reason?: string }): Promise<Message>;
public edit(content: StringResolvable, options?: MessageEditOptions | MessageEmbed): Promise<Message>; public edit(
public edit(options: MessageEditOptions | MessageEmbed | APIMessage): Promise<Message>; content: APIMessageContentResolvable | MessageEditOptions | MessageEmbed | APIMessage,
): Promise<Message>;
public edit(content: StringResolvable, options: MessageEditOptions | MessageEmbed): Promise<Message>;
public equals(message: Message, rawData: object): boolean; public equals(message: Message, rawData: object): boolean;
public fetchWebhook(): Promise<Webhook>; public fetchWebhook(): Promise<Webhook>;
public fetch(force?: boolean): Promise<Message>; public fetch(force?: boolean): Promise<Message>;
public pin(options?: { reason?: string }): Promise<Message>; public pin(options?: { reason?: string }): Promise<Message>;
public react(emoji: EmojiIdentifierResolvable): Promise<MessageReaction>; public react(emoji: EmojiIdentifierResolvable): Promise<MessageReaction>;
public reply( public reply(
content?: StringResolvable, content: APIMessageContentResolvable | (MessageOptions & { split?: false }) | MessageAdditions,
options?: MessageOptions | MessageAdditions | (MessageOptions & { split?: false }) | MessageAdditions, ): Promise<Message>;
public reply(options: MessageOptions & { split: true | SplitOptions }): Promise<Message[]>;
public reply(options: MessageOptions | APIMessage): Promise<Message | Message[]>;
public reply(
content: StringResolvable,
options: (MessageOptions & { split?: false }) | MessageAdditions,
): Promise<Message>; ): Promise<Message>;
public reply( public reply(
content?: StringResolvable, content: StringResolvable,
options?: (MessageOptions & { split: true | SplitOptions }) | MessageAdditions, options: MessageOptions & { split: true | SplitOptions },
): Promise<Message[]>;
public reply(
options?:
| MessageOptions
| MessageAdditions
| APIMessage
| (MessageOptions & { split?: false })
| MessageAdditions
| APIMessage,
): Promise<Message>;
public reply(
options?: (MessageOptions & { split: true | SplitOptions }) | MessageAdditions | APIMessage,
): Promise<Message[]>; ): Promise<Message[]>;
public reply(content: StringResolvable, options: MessageOptions): Promise<Message | Message[]>;
public suppressEmbeds(suppress?: boolean): Promise<Message>; public suppressEmbeds(suppress?: boolean): Promise<Message>;
public toJSON(): object; public toJSON(): object;
public toString(): string; public toString(): string;
@@ -2042,16 +2050,13 @@ declare module 'discord.js' {
lastMessageID: Snowflake | null; lastMessageID: Snowflake | null;
readonly lastMessage: Message | null; readonly lastMessage: Message | null;
send( send(
options: MessageOptions | (MessageOptions & { split?: false }) | MessageAdditions | APIMessage, content: APIMessageContentResolvable | (MessageOptions & { split?: false }) | MessageAdditions,
): Promise<Message>; ): Promise<Message>;
send( send(options: MessageOptions & { split: true | SplitOptions }): Promise<Message[]>;
options: (MessageOptions & { split: true | SplitOptions; content: StringResolvable }) | APIMessage, send(options: MessageOptions | APIMessage): Promise<Message | Message[]>;
): Promise<Message[]>; send(content: StringResolvable, options: (MessageOptions & { split?: false }) | MessageAdditions): Promise<Message>;
send( send(content: StringResolvable, options: MessageOptions & { split: true | SplitOptions }): Promise<Message[]>;
content: StringResolvable, send(content: StringResolvable, options: MessageOptions): Promise<Message | Message[]>;
options?: MessageOptions | (MessageOptions & { split?: false }) | MessageAdditions,
): Promise<Message>;
send(content: StringResolvable, options?: MessageOptions & { split: true | SplitOptions }): Promise<Message[]>;
} }
interface TextBasedChannelFields extends PartialTextBasedChannelFields { interface TextBasedChannelFields extends PartialTextBasedChannelFields {
@@ -2082,17 +2087,19 @@ declare module 'discord.js' {
delete(reason?: string): Promise<void>; delete(reason?: string): Promise<void>;
edit(options: WebhookEditData): Promise<Webhook>; edit(options: WebhookEditData): Promise<Webhook>;
send( send(
content?: StringResolvable, content: APIMessageContentResolvable | (WebhookMessageOptions & { split?: false }) | MessageAdditions,
options?: (WebhookMessageOptions & { split?: false }) | MessageAdditions, ): Promise<Message>;
send(options: WebhookMessageOptions & { split: true | SplitOptions }): Promise<Message[]>;
send(options: WebhookMessageOptions | APIMessage): Promise<Message | Message[]>;
send(
content: StringResolvable,
options: (WebhookMessageOptions & { split?: false }) | MessageAdditions,
): Promise<Message>; ): Promise<Message>;
send( send(
content?: StringResolvable, content: StringResolvable,
options?: (WebhookMessageOptions & { split: true | SplitOptions }) | MessageAdditions, options: WebhookMessageOptions & { split: true | SplitOptions },
): Promise<Message[]>;
send(options?: (WebhookMessageOptions & { split?: false }) | MessageAdditions | APIMessage): Promise<Message>;
send(
options?: (WebhookMessageOptions & { split: true | SplitOptions }) | MessageAdditions | APIMessage,
): Promise<Message[]>; ): Promise<Message[]>;
send(content: StringResolvable, options: WebhookMessageOptions): Promise<Message | Message[]>;
sendSlackMessage(body: object): Promise<boolean>; sendSlackMessage(body: object): Promise<boolean>;
} }
@@ -2166,6 +2173,8 @@ declare module 'discord.js' {
REACTION_BLOCKED: number; REACTION_BLOCKED: number;
} }
type APIMessageContentResolvable = string | number | boolean | bigint | symbol | readonly StringResolvable[];
interface AuditLogChange { interface AuditLogChange {
key: string; key: string;
old?: any; old?: any;
@@ -2706,7 +2715,7 @@ declare module 'discord.js' {
} }
interface MessageEditOptions { interface MessageEditOptions {
content?: string; content?: StringResolvable;
embed?: MessageEmbed | MessageEmbedOptions | null; embed?: MessageEmbed | MessageEmbedOptions | null;
code?: string | boolean; code?: string | boolean;
flags?: BitFieldResolvable<MessageFlagsString>; flags?: BitFieldResolvable<MessageFlagsString>;
@@ -2786,7 +2795,7 @@ declare module 'discord.js' {
interface MessageOptions { interface MessageOptions {
tts?: boolean; tts?: boolean;
nonce?: string; nonce?: string;
content?: string; content?: StringResolvable;
embed?: MessageEmbed | MessageEmbedOptions; embed?: MessageEmbed | MessageEmbedOptions;
disableMentions?: 'none' | 'all' | 'everyone'; disableMentions?: 'none' | 'all' | 'everyone';
allowedMentions?: MessageMentionOptions; allowedMentions?: MessageMentionOptions;
@@ -2806,7 +2815,7 @@ declare module 'discord.js' {
type MessageResolvable = Message | Snowflake; type MessageResolvable = Message | Snowflake;
type MessageTarget = TextChannel | DMChannel | User | GuildMember | Webhook | WebhookClient; type MessageTarget = TextChannel | NewsChannel | DMChannel | User | GuildMember | Webhook | WebhookClient;
type MessageType = type MessageType =
| 'DEFAULT' | 'DEFAULT'

View File

@@ -1,6 +1,6 @@
/// <reference path="index.d.ts" /> /// <reference path="index.d.ts" />
import { Client } from 'discord.js'; import { Client, Message, MessageAttachment, MessageEmbed } from 'discord.js';
const client: Client = new Client(); const client: Client = new Client();
@@ -25,4 +25,29 @@ client.on('messageReactionRemoveAll', async message => {
console.log(`messageReactionRemoveAll - content: ${message.content}`); console.log(`messageReactionRemoveAll - content: ${message.content}`);
}); });
// These are to check that stuff is the right type
declare const assertIsMessage: (m: Promise<Message>) => void;
declare const assertIsMessageArray: (m: Promise<Message[]>) => void;
client.on('message', ({ channel }) => {
assertIsMessage(channel.send('string'));
assertIsMessage(channel.send({}));
assertIsMessage(channel.send({ embed: {} }));
assertIsMessage(channel.send({ another: 'property' }, {}));
const attachment = new MessageAttachment('file.png');
const embed = new MessageEmbed();
assertIsMessage(channel.send(attachment));
assertIsMessage(channel.send(embed));
assertIsMessage(channel.send([attachment, embed]));
assertIsMessageArray(channel.send(Symbol('another primitive'), { split: true }));
assertIsMessageArray(channel.send({ split: true }));
// @ts-expect-error
channel.send();
// @ts-expect-error
channel.send({ another: 'property' });
});
client.login('absolutely-valid-token'); client.login('absolutely-valid-token');