千家信息网

TypeScript中怎么使用Tuple Union声明函数重载

发表于:2025-01-21 作者:千家信息网编辑
千家信息网最后更新 2025年01月21日,这篇文章主要介绍"TypeScript中怎么使用Tuple Union声明函数重载",在日常操作中,相信很多人在TypeScript中怎么使用Tuple Union声明函数重载问题上存在疑惑,小编查阅
千家信息网最后更新 2025年01月21日TypeScript中怎么使用Tuple Union声明函数重载

这篇文章主要介绍"TypeScript中怎么使用Tuple Union声明函数重载",在日常操作中,相信很多人在TypeScript中怎么使用Tuple Union声明函数重载问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"TypeScript中怎么使用Tuple Union声明函数重载"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

问题:

TypeScript 中为函数添加多个签名后,依然需要添加相应的代码来判断并从不同的签名参数列表中获取对应的参数。过去常见的写法:

function refEventEmitter(event?: string): void;function refEventEmitter(event: string, callback: () => void): void;function refEventEmitter(callback: () => void): void;function refEventEmitter(  eventOrCallback?: string | (() => void),  callback?: () => void,): void {  let event: string | undefined;  if (typeof eventOrCallback === 'function') {    callback = eventOrCallback;  } else {    event = eventOrCallback;  }  // ...}

这个过程因为将原有参数列表直接按序号拍平,参数之间的类型关联需要人肉确保正确。

技巧:

这时我们可以通过使用tuple union 的参数类型,来无脑处理各种函数重载情况:

function refEventEmitter(event?: string): void;function refEventEmitter(event: string, callback: () => void): void;function refEventEmitter(callback: () => void): void;function refEventEmitter(  ...args:    | [event?: string]    | [        event: string,        callback: () => unknown,      ]    | [callback: () => unknown]): void {  let [event, callback] =    args.length === 2      ? args      : typeof args[0] === 'function'      ? [undefined, args[0]]      : [args[0], undefined];  // ...}

实际上,此时上方的签名列表也不再需要了:

function refEventEmitter(  ...args:    | [event?: string]    | [        event: string,        callback: () => unknown,      ]    | [callback: () => unknown]): void {  let [event, callback] =    args.length === 2      ? args      : typeof args[0] === 'function'      ? [undefined, args[0]]      : [args[0], undefined];  // ...}
这篇其实拖了有点久,在写的时候发现 TypeScript 已经内置了 "Convert overload list to single signature" 的重构选项,可以一键将重载列表变为参数 tuple union。

不过到这里其实还存在问题,TypeScript 中 typeof 条件判断不能对整个对象进行收窄,只能收窄被 typeof 到的某个元素、属性。上面的例子中,如果需要的不只是 args[0] 就会出现问题。

此时我们可以引入一个工具函数 isTypeOfProperty(object, key, type):

此时实现就变成了:

function refEventEmitter(  ...args:    | [event?: string]    | [        event: string,        callback: () => unknown,      ]    | [callback: () => unknown]): void {  let [event, callback] =    args.length === 2      ? args      : isTypeOfProperty(args, 0, 'function')      ? [undefined, args[0]]      : [args[0], undefined];  // ...}

到此,关于"TypeScript中怎么使用Tuple Union声明函数重载"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!

函数 参数 问题 学习 更多 类型 帮助 不同 实用 接下来 之间 人肉 代码 例子 元素 写法 只是 可以通过 多个 实际 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 温州有没有软件开发 数据库与应用技术是学什么 部队网络安全法 gpu渲染服务器软件开发 网络安全自查报告.doc 软件开发 求职 未来规划 观潮翻译软件开发 网络安全有害程序应急预案 网站怎么在数据库查看密码 美团高科技互联网 云服务器怎么提高安全性 网络安全法正式形式的时间是 网络安全绕过登陆密码的代码 佛山微商软件开发咨询 合肥新华三校招软件开发面试 数据库数据量比较大怎么优化 手机无法联系服务器请检查网络 通过代理服务器玩英雄联盟 网络安全实习生一般月收入 诺亚之心服务器连接失败 供应网络安全在经济方面的重要性 数据库中怎么加数字 宁海嵌入式软件开发外包 安徽电力卫星授时服务器 软件开发费是固定资产吗 网络安全扫描哪些端口 河北同方服务器 公司如何创建数据库 网络安全法怎么保护个人信息 安卓软件开发 题库
0