所谓的重载,其实就是使用相同的函数名,传入不同数量的参数或不同类型的参数,以此创建出多个方法或产生不同结果。

1. 最常见的,也就是根据定义傻瓜式地判断参数类型与数量

  1. function showPerson (name, ...others) {
  2. console.log(name, others)
  3. }
  4.  
  5. showPerson('tate', {age: 25, test: 'test str'})

2. 其次就是使用常规的重载签名

使用重载签名进行重载,好处在于可以对传入的参数进行限制,只有当签名存在对应类型或数量的参数时,才不会报错。

此处定义完重载签名之后,一定要有具体实现

  1. function showPerson (name: string): void;
  2. function showPerson (age: number): void;
  3. function showPerson (play: () => void): void;
  4. function showPerson (...args) {
  5. console.log(args)
  6. // 根据函数类型和数量作出不同的行为
  7. }

重载签名配合可选参数可以使重载变得更加灵活

  1. function showPerson (name:string, age?: number, play?: () => void): void;
  2.  
  3. // 利用重载签名 对不同的缺省做相应的处理
  4. function showPerson (name, age, play) {
  5. // dosomething
  6. }
  7. showPerson('tate', 25)

3.利用特定重载签名做更加细致的重载处理

鄙人比较喜欢NBA,就拿NBA举例。比如说现在需要写一个函数,符合此函数规则的只有三个人: 姚明,科比和詹姆斯;只有当名字是姚明的时候,他才可以打中锋, 是科比的时候才能打后卫,是詹姆斯的时候才能打前锋,并且因为国内球员比较瘦弱,所以只有当姚明是25岁以上的时候,才能被归为合格的中锋(只是举个例子,不要太当真),那这个时候就用到特定重载签名了。

  1. function playBasketball (name: 'YaoMing', age: number): void;
  2. function playBasketball (name: 'Kobe', age?: number): void
  3. function playBasketball (name: 'James', age?: number): void;
  4.  
  5. function playBasketball (name: string, age: number) {
  6. if (name === 'YaoMing' && age && age >= 25) {
  7. console.log('good Center')
  8. } else if (name === 'Kobe') {
  9. console.log('good guard')
  10. } else if (name === 'Jams') {
  11. console.log('good forward')
  12. } else {
  13. console.log('ordinary baskerball player')
  14. }
  15. }
  16.  
  17. playBasketball('YaoMing', 25);
  18. playBasketball('Kobe'); 

4.  使用接口搭配重载签名或非重载签名

  1. interface BasketballPlayer {
  2. (name: 'YaoMing', age: number): void;
  3. (name: 'Kobe', age: number): void;
  4. (name: 'James', age: number): void;
  5. }
  6. let playBasketball: BasketballPlayer = function (name) {
  7. if (name === 'YaoMing') {
  8. // dosomething
  9. }
  10. }

使用接口配合函数的默认参数,可实现特定重载签名的效果:

  1. interface BasketballPlayer {
  2. (name: 'YaoMing', age: number): void;
  3. (name: 'Kobe', age: number): void;
  4. (name: 'James', age: number): void;
  5. }
  6. let playBasketball: BasketballPlayer = function (name = 'Yaoming', age: number) {
  7. if (age >= 25) {
  8. console.log('good center')
  9. }
  10. }
  11.  
  12. let playBasketball2: BasketballPlayer = function (name = 'Kobe') {
  13. console.log('good guard')
  14. }
  15.  
  16. let playBasketball3: BasketballPlayer = function (name = 'James') {
  17. console.log('good forward');
  18. }  

此处其并非严格意义上的重载,但是却利用了重载的思想,并且灵活搭配了函数的默认参数。

TS在大型项目中带来的优势超乎我们的想象,其他各方面的分享将会持续进行,有兴趣的小伙伴可持续关注。

Typescript 常见的几种函数重载方法详解与应用示例的更多相关文章

  1. Php中常见的4种随机密码生成方法详解

    使用PHP开发应用程序,尤其是网站程序,常常需要生成随机密码,如用户注册生成随机密码,用户重置密码也需要生成一个随机的密码.随机密码也就是一串固定长度的字符串,这里我收集整理了几种生成随机字符串的方法 ...

  2. 【转】Python的hasattr() getattr() setattr() 函数使用方法详解

    Python的hasattr() getattr() setattr() 函数使用方法详解 hasattr(object, name)判断一个对象里面是否有name属性或者name方法,返回BOOL值 ...

  3. laravel 框架配置404等异常页面的方法详解(代码示例)

    本篇文章给大家带来的内容是关于laravel 框架配置404等异常页面的方法详解(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 在Laravel中所有的异常都由Handl ...

  4. Python的hasattr() getattr() setattr() 函数使用方法详解

    hasattr(object, name)判断一个对象里面是否有name属性或者name方法,返回BOOL值,有name特性返回True, 否则返回False.需要注意的是name要用括号括起来 1 ...

  5. PHPCMS联动菜单的调用函数get_linkage方法详解

    v9联动菜单调用方法[注意此为内容页调用方法 {get_linkage($areaid,1,' >> ',1)} 显示效果: 湖北省 >> 武汉市 >> 汉阳区 [ ...

  6. java本地方法如何调用其他程序函数,方法详解2

    Java调用本地方法(JNI浅谈) (2006-11-27 14:55:36) 转载▼   分类: Java类文章                本人在项目开发实践中的总结和体会     前段时间公司 ...

  7. java本地方法如何调用其他程序函数,方法详解

    JNI是Java Native Interface的缩写,中文为JAVA本地调用.从Java 1.1 开始,Java Native Interface (JNI)标准成为java平台的一部分,它允许J ...

  8. Python的hasattr() getattr() setattr() 函数使用方法详解 (转)

    来自:https://www.cnblogs.com/cenyu/p/5713686.html hasattr(object, name)判断一个对象里面是否有name属性或者name方法,返回BOO ...

  9. MySQL中count函数使用方法详解

      count函数是用来统计表中或数组中记录的一个函数,下面我来介绍在MySQL中count函数用法与性能比较吧. count(*) 它返回检索行的数目, 不论其是否包含 NULL值. SELECT ...

随机推荐

  1. Confluence 6 整合到其他数据库

    这个文档描述了如何整合你的 Confluence 数据库从你已经存在的数据库上到其他的数据库.这个指南被用来指导你从使用评估数据库转移到使用生产数据库. 大数据量需要第三方的数据库整合工具. 本页面对 ...

  2. flask 中orm关系映射 sqlalchemy的查询

    flask的orm框架(SQLAlchemy)-一对多查询以及多对多查询   一对多,多对多是什么? 一对多.例如,班级与学生,一个班级对应多个学生,或者多个学生对应一个班级. 多对多.例如,学生与课 ...

  3. python并发编程之进程池,线程池,协程

    需要注意一下不能无限的开进程,不能无限的开线程最常用的就是开进程池,开线程池.其中回调函数非常重要回调函数其实可以作为一种编程思想,谁好了谁就去掉 只要你用并发,就会有锁的问题,但是你不能一直去自己加 ...

  4. 基于Form组件实现的增删改和基于ModelForm实现的增删改

    一.ModelForm的介绍 ModelForm a. class Meta: model, # 对应Model的 fields=None, # 字段 exclude=None, # 排除字段 lab ...

  5. laravel 统计数据

    //根据format字符串格式化date值.下列修饰符可以被用在format字符串中:  //%M 月名字(January……December)  //%W 星期名字(Sunday……Saturday ...

  6. HTML&javaSkcript&CSS&jQuery&ajax(11)

    1.localStorage 没有 时间的限制数据存储, sessionStorage 针对一个session的存储,首先检查浏览器是否支持对这两个的存储, ifI(type(Storage)!==& ...

  7. Python GUI界面编程

    常用GUI框架 wxPython 安装wxPython pip install -U wxPython C:\Users> pip install -U wxPython Collecting ...

  8. Python函数之递归函数

    递归函数的定义:在这个函数里再调用这个函数本身 最大递归深度默认是997或者998,python从内存角度做的限制 优点:代码变简单 缺点:占内存 一:推导年龄 问a的值是多少: a 比 b 小2,b ...

  9. IDM的Google商店插件

    官方扩展链接:https://chrome.google.com/webstore/detail/idm-integration-module/ngpampappnmepgilojfohadhhmbh ...

  10. 关于浏览器对html, js,css的解析先后顺序的理解

    1.首先要了解页面的结构(包含哪些元素?哪些计算机语言能够在页面中运行 ) (1)html          不仅可以包含文字,还可以包含图片.链接,甚至音乐.程序等非文字元素的标记语言       ...