Ts函数重载

149 阅读2分钟

一、函数重载的优势

typescript-logo.jpg

  1. 结构分明,让代码可读性和维护性提高。
  2. 各司其职,让重载签名函数完成各自功能,自动提示方法和属性。
  3. 更利于功能扩展

二、函数重载的定义

一组具有相同名字,不同参数列表的和返回值无关的函数。 // 较为模糊

完整的函数定义及规则
  1. 函数签名=函数名称+函数参数+函数参数类型+返回值类型
  2. 由一个实现签名+ 一个或多个重载签名合成。
  3. 只有实现签名配备了函数体,所有的重载签名都只有签名,没有配备函数体
  4. 在外部调用时只能调用重载函数名。
  5. 实现签名下的函数体是给重载签名编写的,在定义时起到了统领所有重载标签的作用,在调用执行时就看不到实现签名了。
  6. 调用重载函数时,会根据传递的参数来判断你调用的是哪一个函数。
  7. 实现签名个数可以少于重载签名个数,但实现签名包含某个重载签名的参数时,那么实现签名就必须兼容所有重载签名该参数的类型【例联合类型或any或unknown】
  8. 实现签名自动推到返回值类型,但需要提供给重载签名真是返回值类型

三、消息查询案例

type Message = 'image' | 'audio' | string
type MessageType = {
  id: number,
  type: Message,
  sendMessage: string
}
let MessageLists: MessageType[] = [
  {id: 1, type: 'image', sendMessage: '书山有路勤为径'},
  {id: 2, type: 'audio', sendMessage: '学海无涯苦作舟'},
  {id: 3, type: 'audio', sendMessage: '人之初,性本善'},
  {id: 4, type: 'image', sendMessage: '弟子规,圣人训'},
  {id: 5, type: 'image', sendMessage: '次谨信,泛爱众'}
]
// 需求一:如果传入为数字, 就认为消息 id,然后从从后端数据源中找对应 id 的数据并返回
// 需求二:否则当成类型,返回这一类型的全部消息。
// 为扩展功能:仅查看N条消息
function searchMessages(id: number): MessageType
function searchMessages(typeMsg: Message, searchItems: number): MessageType[]
function searchMessages(value: unknown, searchItems: number = 0) {
  if (typeof value === 'number') {
    return MessageLists.find(ele => ele.id === value)
  } else {
    return MessageLists.filter(ele => ele.type === value).splice(0, searchItems)
  }
}
searchMessages('image', 2).forEach(ele => {
  console.log(ele.sendMessage)
})