TS 函数重载

今天我们项目老大给我们分享了这样一个问题,记录一下。
在实现某个功能的时候, 要写一个时间转换的函数, 大概就是传递一个Moment对象进去, 然后给我返回一个格式为YYYY-MM-DD HH:mm:ss的字符串, 如果参数是undefined, 就不做处理,返回undefined; 然后写了这样一个函数:

function handleDateFormat(date?: moment.Moment): string | undefined {
  if (!date) {
    return ;
  }
  return date.format('YYYY-MM-DD HH:mm:ss');
};
  
const str = handleDateFormat(moment());

但是这样有个问题,就是这个函数的返回类型无论在什么时候都是 string| undefined类型;但是实际上我们知道,当传入的参数为Moment的时候,他的返回值一定是string, 而传入的参数为undefined的时候,返回值一定是一定是undefined。 但是显然TS不知道。这时,我们就需要想个办法来手动收束一下这个函数的返回类型。
在这里插入图片描述
在这里插入图片描述

在一些后端语言里面,有函数重载这样一个概念,允许在同一范围内指定多个同名函数。 这些函数称为重载函数或重载。 利用重载函数,你可以根据参数的类型和数量为函数提供不同的语义。而ts也提供了函数重载的功能。我们可以利用函数重载,为这个函数提供多个函数类型定义,来解决我们刚才说的这个问题。

  function handleDateFormat<T extends moment.Moment | undefined>(
    date: T
  ): T extends moment.Moment ? string : undefined;
  function handleDateFormat(date?: moment.Moment): string | undefined {
    if (!date) {
      return ;
    }
    return date.format('YYYY-MM-DD HH:mm:ss');
  }

声明多个相同名称的函数,给他们设置多个不同的入参类型和返回类型。在我们调用这个重载函数的时候,TS会把你所传入的参数类型与定义中的参数类型进行比较,决定选用最合适的定义。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
此时,不管我们传入什么参数,都能得到我们想要的返回值类型。

注意点:

  • 为了让编辑器能够选择正确的检查类型, 他会从重载列表的第一个开始匹配, 因此,在定义重载时, 一定要把最精确的定义放在最前面。
  • 重载签名必须均导出或均不导出!
    在这里插入图片描述
  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值