TS函数重载

有这样的一个场景
根据ID或者文件类型查找聊天记录
下面是我们的代码

type MessageType = 'image' | 'vedio' | string

type Message = {
    id: number,
    type: MessageType,
    sendMessage: string
}

let message:Message[]  = [
    {
        id: 1,
        type: 'image',
        sendMessage: '张三犯法了吗'
    },
    {
        id: 2,
        type: 'vedio',
        sendMessage: '李四犯法了吗'
    },
    {
        id: 3,
        type: 'image',
        sendMessage: '王五犯法了吗'
    }
]


function getMessage (type: number | MessageType ):Message | Message[] | undefined {
    if(typeof type === "number") {
      return  message.find((v)=> v.id === type)
    } else {
        return  message.filter((v)=> v.type === type)
    }
}

// 将这个函数返回的值转换成我们一直定义函数的返回值
let msg = (<Message>getMessage(1)).sendMessage

如果我们这样取函数的返回值是会报错的
在这里插入图片描述
使用下面代码的写法
对函数的返回值做一个类型限定

let msg = (<Message>getMessage(1)).sendMessage

接下来我们使用函数重载来实现
// 根据ID查询记录
// 根据类型查询记录

function getMessage(type: number):Message // 根据ID查询记录
function getMessage(type: MessageType):Message[]  // 根据类型查询记录
function getMessage (type: any ):Message | Message[] | undefined {
    if(typeof type === "number") {
      return  message.find((v)=> v.id === type)
    } else {
        return  message.filter((v)=> v.type === type)
    }
}

// 将这个函数返回的值转换成我们一直定义函数的返回值
let msg = (getMessage(1)).sendMessage

下面有这样的一种要求
根据类型查询记录,但是限制了记录的数量

function getMessage(type: number):Message 
function getMessage(type: MessageType, readNum: number):Message[] 
function getMessage (type: any, readNum: number = 2 ):Message | Message[] | undefined {
    if(typeof type === "number") {
      return  message.find((v)=> v.id === type)
    } else {
        return  message.filter((v)=> v.type === type).splice(0, readNum)
    }
}

// 将这个函数返回的值转换成我们一直定义函数的返回值
console.log(getMessage("image", 3));

函数重载有一下几种规则

  1. 有一个实现签名 + 一个或多个重载签名合成
  2. 但外部调用函数重载定义的函数时,只能调用重载签名,不能调用实现签名
  3. 调用重载签名的函数时,会根据传递的参数来判断你调用的是哪一个函数
  4. 只有一个函数体,只有实现签名配备了函数体,所有的重载签名都只有签名, 没有配备函数体

函数重载的优势

  1. 结构分明
  2. 各司其职,自动提示方法和属性
  3. 更利于功能拓展
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值