函数重载是有一个函数实现签名外加一个或者多个函数重载签名组成
一组具有相同名字,不同参数列表和返回值无关的函数
函数签名即指:函数名 函数参数 参数类型 返回值类型四者合成
在我的理解中,函数重载和我们reducer较为相似,都是接收不同的对象,通过判断参数的类型,来达到同一函数实现不同功能的效果,不同的是函数重载是我们ts中的概念,受到ts语法的约束,需要声明传递什么类型的参数时,需要返回什么样的值
函数重载的特点
函数名相同,但参数列表不同,包括参数类型、个数和顺序。
返回值类型可以相同也可以不同。
函数重载可以发生在同一个类中,也可以发生在不同的类中。
函数重载的优点
提高代码的可读性和可维护性,可以根据函数名来推测函数的功能。
避免了命名冲突,可以使用相同的函数名来表示不同的操作。
提供了更灵活的函数调用方式,可以根据实际需求选择不同的函数。
interface Message {
id: number
type: string
sendmessage: string
}
type MessageType = 'image' | 'audio' | string
const messages: Message[] = [
{
id: 1,
type: 'audio',
sendmessage: '你好啊,今晚咱们一起去三里屯吧'
},
{
id: 2,
type: 'audio',
sendmessage: '朝辞白帝彩云间,千里江陵一日还'
},
{
id: 3,
type: 'audio',
sendmessage: '你好!张无忌'
},
{
id: 4,
type: 'audio',
sendmessage: '刘老根苦练舞台绝技!'
},
{
id: 5,
type: 'audio',
sendmessage: '今晚王牌对王牌节目咋样?'
}
]
// 重载签名
function getMessage(value: number): Message | undefined
function getMessage(value: MessageType, linmit?: number): Message[]
// 实现签名
function getMessage(payload_: number | MessageType, linmit?: number) {
if (typeof payload_ === 'number') {
return messages.find((item) => item.id === payload_)
} else {
const result = messages.filter((item) => item.type === payload_)
return (linmit && result.splice(0, linmit)) || result
}
}
console.log(getMessage('audio', 3))