TypeScript如何声明函数重载,各种函数重载情况是怎样
Admin 2022-09-09 群英技术资讯 1314 次浏览
在实际应用中,我们有时候会遇到“TypeScript如何声明函数重载,各种函数重载情况是怎样”这样的问题,我们该怎样来处理呢?下文给大家介绍了解决方法,希望这篇“TypeScript如何声明函数重载,各种函数重载情况是怎样”文章能帮助大家解决问题。问题:
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];
// ...
}
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
这篇文章主要介绍了Vue+elementUI下拉框自定义颜色选择器方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
这篇文章给大家分享的是有关用jquery实现图片对比的效果的内容,这也是比较常见的效果,小编觉得挺实用的,因此分享给大家做个参考,感兴趣的朋友就跟随小编看看吧。
vue怎么实现打印功能?一些朋友对于打印页面的表格功能的实现比较好奇,因此这篇文章就给大家来分析一下vue实现打印功能实现的方法,下文有示例供大家参考,接下来跟随小编一起看看吧。
这篇文章主要给大家分享的是关于JavaScript执行上下文的内容,一些朋友可能对于JavaScript执行上下文不是很了解,对此这篇文章就给大家来介绍一下JavaScript执行上下文机JavaScript执行上下文栈,感兴趣的朋友就继续往下看吧。
原生JS编写时哪些写法要避免?我们知道原生JS编写是有规范和要求的,而且有良好的代码编写习惯也是很重要的,对此本文就给大家来介绍一下原生JS中应该禁止出现的几种写法,感兴趣的朋友可以了解看看。
成为群英会员,开启智能安全云计算之旅
立即注册关注或联系群英网络
7x24小时售前:400-678-4567
7x24小时售后:0668-2555666
24小时QQ客服
群英微信公众号
CNNIC域名投诉举报处理平台
服务电话:010-58813000
服务邮箱:service@cnnic.cn
投诉与建议:0668-2555555
Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 ICP核准(ICP备案)粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008