1、函数重载
具有相同名称但参数不同的两个或多个函数称为重载函数。
函数签名的含义:
函数签名 = 函数名称 + 函数参数 + 函数参数类型 + 返回值类型
// 这样写代码可读性差,不好维护--优化:使用函数重载
function searchMessage(value: number | MessageType): Message | Array<Message> | undefined {
if (typeof value === 'number') {
return messages.find((item) => item.id === value)
} else {
return messages.filter((item) => item.type === value)
}
}
console.log(searchMessage('audio'))
ts没有办法在运行之前根据传入的值来推导方法最终返回的数据的数据类型。
如果非要用这种方式获得数据,需要做类型转换或者断言
如下:
console.log((<Message>searchMessage(1)).sendMessage)
console.log((searchMessage(1) as Message).sendMessage)
重载
function searchMessage(value: number): Message
function searchMessage(value: MessageType): Array<Message>
function searchMessage(value: any) {
if (typeof value === 'number') {
return messages.find((item) => item.id === value)
} else {
return messages.filter((item) => item.type === value)
}
}
console.log(searchMessage('audio'))
console.log(searchMessage(1))
重载规则:
1:由一个实现签名+一个或者让多个重载签名合成
2:外部调用的是重载签名,实现签名只是在定义时起到统领重载签名的作用,执行时看不到(实际执行时是执行的重载函数签名 + 实现签名函数体)
3:调用重载签名时,会根据传参判断调用哪一个函数
4:只有一个函数体,配备给了实现签名。重载函数只有签名,没有函数体
5:实现签名的参数可以小于重载签名
6:重载函数必须提供返回值,ts无法默认推导
any vs unknown
unknow可以作为任意类型的父类,但是不能作为任意类型的子类
any既可以做为任意类型的父类,也可以作为任意类型的子类