types(Partials): add toString() method to supported Partials (#9835)

* types(Partials): add toString() method to supported Partials

- includes `PartialDMChannel`, `PartialGuildMember` and `PartialUser`
- does not include
    - `PartialMessage`, since `<PartialMessage>.content` is always null
    - `PartialMessageReaction`, since `MessageReaction` has no `toString()` method
    - `PartialThreadMember`, since `ThreadMember` has no `toString()` method

* types(Partials): replace type of `toString()` methods with return type

* test(Partials): add tests

* types(Partialize): refactor Partialize

* test(PartialThreadMember): fix typo

* types(Partials): clean up unnecessary type overrides

* test(Partials): add tests for <Partials>.partial property

---------

Co-authored-by: Jiralite <33201955+Jiralite@users.noreply.github.com>
This commit is contained in:
Jan Parisek
2023-10-10 15:39:28 +02:00
committed by GitHub
parent 1fe7247528
commit 7422d9f172
2 changed files with 50 additions and 8 deletions

View File

@@ -6161,15 +6161,17 @@ export interface PartialChannelData {
export type Partialize< export type Partialize<
T extends AllowedPartial, T extends AllowedPartial,
N extends keyof T | null = null, NulledKeys extends keyof T | null = null,
M extends keyof T | null = null, NullableKeys extends keyof T | null = null,
E extends keyof T | '' = '', OverridableKeys extends keyof T | '' = '',
> = { > = {
readonly client: Client<true>; [K in keyof Omit<T, OverridableKeys>]: K extends 'partial'
id: Snowflake; ? true
partial: true; : K extends NulledKeys
} & { ? null
[K in keyof Omit<T, 'client' | 'id' | 'partial' | E>]: K extends N ? null : K extends M ? T[K] | null : T[K]; : K extends NullableKeys
? T[K] | null
: T[K];
}; };
export interface PartialDMChannel extends Partialize<DMChannel, null, null, 'lastMessageId'> { export interface PartialDMChannel extends Partialize<DMChannel, null, null, 'lastMessageId'> {

View File

@@ -177,6 +177,10 @@ import {
StringSelectMenuComponentData, StringSelectMenuComponentData,
ButtonComponentData, ButtonComponentData,
MediaChannel, MediaChannel,
PartialDMChannel,
PartialGuildMember,
PartialMessage,
PartialMessageReaction,
} from '.'; } from '.';
import { expectAssignable, expectNotAssignable, expectNotType, expectType } from 'tsd'; import { expectAssignable, expectNotAssignable, expectNotType, expectType } from 'tsd';
import type { ContextMenuCommandBuilder, SlashCommandBuilder } from '@discordjs/builders'; import type { ContextMenuCommandBuilder, SlashCommandBuilder } from '@discordjs/builders';
@@ -2323,3 +2327,39 @@ expectType<Readonly<GuildMemberFlagsBitField>>(guildMember.flags);
const onboarding = await guild.fetchOnboarding(); const onboarding = await guild.fetchOnboarding();
expectType<GuildOnboarding>(onboarding); expectType<GuildOnboarding>(onboarding);
} }
declare const partialDMChannel: PartialDMChannel;
expectType<true>(partialDMChannel.partial);
expectType<undefined>(partialDMChannel.lastMessageId);
declare const partialGuildMember: PartialGuildMember;
expectType<true>(partialGuildMember.partial);
expectType<null>(partialGuildMember.joinedAt);
expectType<null>(partialGuildMember.joinedTimestamp);
expectType<null>(partialGuildMember.pending);
declare const partialMessage: PartialMessage;
expectType<true>(partialMessage.partial);
expectType<null>(partialMessage.type);
expectType<null>(partialMessage.system);
expectType<null>(partialMessage.pinned);
expectType<null>(partialMessage.tts);
expectAssignable<null | Message['content']>(partialMessage.content);
expectAssignable<null | Message['cleanContent']>(partialMessage.cleanContent);
expectAssignable<null | Message['author']>(partialMessage.author);
declare const partialMessageReaction: PartialMessageReaction;
expectType<true>(partialMessageReaction.partial);
expectType<null>(partialMessageReaction.count);
declare const partialThreadMember: PartialThreadMember;
expectType<true>(partialThreadMember.partial);
expectType<null>(partialThreadMember.flags);
expectType<null>(partialThreadMember.joinedAt);
expectType<null>(partialThreadMember.joinedTimestamp);
declare const partialUser: PartialUser;
expectType<true>(partialUser.partial);
expectType<null>(partialUser.username);
expectType<null>(partialUser.tag);
expectType<null>(partialUser.discriminator);