Я пытаюсь сделать некоторые переопределения событий, так что если первый параметр является чем-то конкретным, второй параметр будет чем-то конкретным в зависимости от первого, но он использует только первый, код, в котором есть перегрузки:

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, и все остальное заканчивается тем же результатом как примеры.

0
The Fruity Furry 2 Дек 2019 в 21:44
1
Рассмотрите возможность предоставления минимально воспроизводимого примера в тексте самого вопроса, подходящего для перехода в автономную среду IDE для демонстрации ваша проблема. Изображения кода и внешние ссылки, возможно, являются полезными дополнениями, но их не следует использовать вместо самостоятельного текстового примера в самом вопросе (см. рекомендации для Как спросить).
 – 
jcalz
2 Дек 2019 в 22:22
 – 
Aleksi
9 Дек 2019 в 09:10

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
}

Проверьте этот ответ, чтобы узнать больше.

0
Aleksi 9 Дек 2019 в 09:09