如何为具有重载签名的单个实现推断Typescript参数类型?

如何为具有重载签名的单个实现推断Typescript参数类型?,typescript,overloading,Typescript,Overloading,我的调用方法有两个签名和一个实现: call<T extends CallChannel, TArgs extends CallParameters[T]>(channel: T, ...args: TArgs): ReturnType<CallListener<T>>; call<T extends SharedChannel, TArgs extends SharedParameters[T]>(channel: T, ...args: TAr

我的
调用
方法有两个签名和一个实现:

call<T extends CallChannel, TArgs extends CallParameters[T]>(channel: T, ...args: TArgs): ReturnType<CallListener<T>>;
call<T extends SharedChannel, TArgs extends SharedParameters[T]>(channel: T, ...args: TArgs): ReturnType<SharedListener<T>>;
call(channel, ...args) { ... }
因为当
T
SharedChannel
时,类型
CallParameters[T]
无法解析(反之亦然)


我已经提供了定义
调用所需的所有类型信息,如何使typescript对实现的签名感到满意?

您应该能够对条件类型执行此操作

为参数和返回定义条件类型

    type Args<T extends CallChannel | SharedChannel> = 
        T extends CallChannel 
        ? CallParameters[T] 
        : T extends SharedChannel 
        ? SharedParameters[T] 
        : never
类型Args=
T扩展呼叫通道
? 调用参数[T]
:T扩展共享通道
? 共享参数[T]
:从不
然后更新函数以使用它:

 TArgs extends Args<T>
TArgs扩展Args
返回可以使用相同的原则

 TArgs extends Args<T>