TypeScript如何声明函数重载,各种函数重载情况是怎样
Admin 2022-09-09 群英技术资讯 430 次浏览
问题:
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进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
URL.createObjectURL() 静态方法会创建一个 DOMString,其中包含一个表示参数中给出的对象的URL。这个 URL 的生命周期和创建它的窗口中的 document 绑定。这个新的URL 对象表示指定的 File 对象或 Blob 对象。
vue中watch是什么?watch就是监测 Vue 实例变化的一个表达式或方法。回调函数得到的参数为新值和旧值,用一个函数取代。那么vue中watch的用法又是什么呢?在vue中watch的用法大致有三种,包括常用用法,立即执行和深度监听。下面我们来具有看看。
首先到nodejs的官网安装nodejs,地址nodejs.org,网站第一页会根据你的电脑系统推荐你适合的版本,下载,不断next,在cmd中输入node-v可以看到版本的话,即安装成功。说到js,大家一定头痛的就是导入众多js代码,不可避免的函数冲突问题,nodejs的一个好处就是各个函数之间相互独立,不会冲突。nodejs:url.parseurl.formaturl.res
这篇文章主要介绍了使用Vue3实现一个Upload组件的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
这篇文章主要介绍了React Diff原理的相关资料,帮助大家更好的理解和学习使用React框架,感兴趣的朋友可以了解下
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008