一、函数重载的优势
- 结构分明,让代码可读性和维护性提高。
- 各司其职,让重载签名函数完成各自功能,自动提示方法和属性。
- 更利于功能扩展
二、函数重载的定义
一组具有相同名字,不同参数列表的和返回值无关的函数。 // 较为模糊
完整的函数定义及规则
- 函数签名=函数名称+函数参数+函数参数类型+返回值类型
- 由一个实现签名+ 一个或多个重载签名合成。
- 只有实现签名配备了函数体,所有的重载签名都只有签名,没有配备函数体
- 在外部调用时只能调用重载函数名。
- 实现签名下的函数体是给重载签名编写的,在定义时起到了统领所有重载标签的作用,在调用执行时就看不到实现签名了。
- 调用重载函数时,会根据传递的参数来判断你调用的是哪一个函数。
- 实现签名个数可以少于重载签名个数,但实现签名包含某个重载签名的参数时,那么实现签名就必须兼容所有重载签名该参数的类型【例联合类型或any或unknown】
- 实现签名自动推到返回值类型,但需要提供给重载签名真是返回值类型
三、消息查询案例
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)
})