Я пытаюсь сделать некоторые переопределения событий, так что если первый параметр является чем-то конкретным, второй параметр будет чем-то конкретным в зависимости от первого, но он использует только первый, код, в котором есть перегрузки:
interface EventListeners<T> {
(event: "channelUpdate", listener: (channel: AnyGuildChannel, oldChannel: GenericOldChannel) => void): T;
(event: "channelUpdate", listener: (channel: TextChannel, oldChannel: OldTextChannel) => void): T;
(event: "channelUpdate", listener: (channel: VoiceChannel, oldChannel: OldVoiceChannel) => void): T;
(event: "channelUpdate", listener: (channel: CategoryChannel, oldChannel: OldCategoryChannel) => void): T;
(event: "channelUpdate", listener: (channel: NewsChannel, oldChannel: OldNewsChannel) => void): T;
(event: "channelUpdate", listener: (channel: StoreChannel, oldChannel: OldStoreChannel) => void): T;
}
Я разместил определения интерфейса здесь, а полные определения здесь. «Полный» код не мой, это общедоступный модуль, и он немного устарел. Проблема здесь в том, что первый интерфейс является единственным используемым интерфейсом. Люди хотят иметь возможность использовать instanceof
для изменения используемой перегрузки.
Первый параметр работает нормально (пример).
Второй параметр использует первую перегрузку независимо от того, что я пробовал (пример).
Я не совсем уверен, что я должен здесь делать, я пробовал несколько вещей, таких как объединение перегрузок прослушивателя в одно определение, но это приводит к any
, и все остальное заканчивается тем же результатом как примеры.
1 ответ
Попробуйте использовать один параметр объекта вместо позиционных параметров:
type ChannelUpdateProps =
| { channel: AnyGuildChannel; oldChannel: GenericOldChannel }
| { channel: TextChannel; oldChannel: OldTextChannel }
| { channel: VoiceChannel; oldChannel: OldVoiceChannel }
| { channel: CategoryChannel; oldChannel: OldCategoryChannel }
| { channel: NewsChannel; oldChannel: OldNewsChannel }
| { channel: StoreChannel; oldChannel: OldStoreChannel }
interface EventListeners<T> {
(event: 'channelUpdate', listener: (props: ChannelUpdateProps) => void): T
}
Проверьте этот ответ, чтобы узнать больше.
Похожие вопросы
Связанные вопросы
Новые вопросы
typescript
TypeScript — это типизированный надмножество JavaScript, транспилируемое в обычный JavaScript. Он добавляет в JavaScript необязательные типы, классы, интерфейсы и модули. Этот тег предназначен для вопросов, специфичных для TypeScript. Он не используется для общих вопросов по JavaScript.