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

View File

@@ -1,6 +1,6 @@
/// <reference path="index.d.ts" />
import { Client } from 'discord.js';
import { Client, Message, MessageAttachment, MessageEmbed } from 'discord.js';
const client: Client = new Client();
@@ -25,4 +25,29 @@ client.on('messageReactionRemoveAll', async message => {
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');