typescript - 如何为具有重载签名的单个实现推断 Typescript 参数类型?
问题描述
我的call
方法有两个签名和一个实现:
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) { ... }
但是 Typescript 不会进行类型检查,因为 to 的参数call
是隐式类型的any
。显然它们不应该是,对于第一个参数,它们必须是CallChannel
orSharedChannel
类型,同样,第二个参数是两个特定类型之一。
但我不能像这样定义实现:
call<T extends CallChannel | SharedChannel, TArgs extends CallParameters[T] | SharedParameters[T]> (channel: T, ...args: TArgs) {
因为类型CallParameters[T]
无法解析 whenT
是 a SharedChannel
(反之亦然)。
我已经提供了定义所需的所有类型信息call
,如何让 typescript 对实现的签名感到满意?
解决方案
您应该能够使用条件类型来做到这一点。
为 args 和 return 定义条件类型。
type Args<T extends CallChannel | SharedChannel> =
T extends CallChannel
? CallParameters[T]
: T extends SharedChannel
? SharedParameters[T]
: never
然后更新函数以使用它:
TArgs extends Args<T>
返回可以使用相同的原理。
推荐阅读
- module - 内部表示未隐藏在 f# 模块中
- security - 如何在 scapy 的 tls 中发送原始数据?
- karate - 空手道 API 测试 - 从响应中删除重复值并将其与新响应进行比较
- java - Google 应用引擎 没有与此 URL 匹配的处理程序
- python-3.x - 没有提供渐变
- highcharts - Highcharts - 向箱线图添加边框半径
- flutter - Navigator.removeRoute & Navigator.removeRouteBelow
- autodesk-forge - AutodeskForge 支持哪个版本的 Revit?
- c++ - 使用带有 Windows Active Directory 的 LDAP 进行用户身份验证 (Windows Server 2016)
- command-line-arguments - Picocli:如何使子命令成为必需