重载
重载允许一个函数接受不同数量或类型的参数时,作出不同的处理。
比如,我们需要实现一个函数 reverse
,输入数字 123
的时候,输出反转的数字 321
,输入字符串 'hello'
的时候,输出反转的字符串 'olleh'
。
利用联合类型,我们可以这么实现:
function reverse(x: number | string): number | string {
if (typeof x === 'number') {
return Number(x.toString().split('').reverse().join(''))
} else {
return x.split('').reverse().join('')
}
}
然而这样有一个缺点,就是不能够精确的表达,输入为数字的时候,输出也应该为数字,输入为字符串的时候,输出也应该为字符串。
这时,我们可以使用重载定义多个 reverse
的函数类型:
// function reverse(x: number | string): number | string {
// if (typeof x === 'number') {
// return Number(x.toString().split('').reverse().join(''))
// } else {
// return x.split('').reverse().join('')
// }
// }
// 重复定义了多次函数 `reverse`,前几次都是函数定义,最后一次是函数实现
// TypeScript 会优先从最前面的函数定义开始匹配,
// 所以多个函数定义如果有包含关系,需要优先把精确的定义写在前面
// function reverse(x: number): number
// function reverse(x: string): string
// function reverse(x: number | string): number | string {
// if (typeof x === 'number') {
// return Number(x.toString().split('').reverse().join(''))
// } else {
// return x.split('').reverse().join('')
// }
// }
function reverse(x: number): number
function reverse(x: string): string
function reverse(x: number | string): number | string {
if (typeof x === 'number') {
return Number(x.toString().split('').reverse().join(''))
} else {
return x.split('').reverse().join('')
}
}
上例中,我们重复定义了多次函数 reverse
,前几次都是函数定义,最后一次是函数实现。在编辑器的代码提示中,可以正确的看到前两个提示。
注意,TypeScript 会优先从最前面的函数定义开始匹配,所以多个函数定义如果有包含关系,需要优先把精确的定义写在前面。
// 如果要给某一个位置添加 对象的类型, 使用接口去解决文通
interface IUser {
// 实际上就相当于你自己定义了一个数据类型
firstName?: string; // 结尾 可以 什么也不写,也可以写为 , 还可以写为;
lastName?: string;
}
// // user 是一个对象 需要通过 接口 来定义对象的数据类型
// function greeter1 (user: IUser): string {
// return 'hello' + user.firstName + ' ' + user.lastName
// }
// function greeter1 (user: { firstName: string, lastName: string }): string {
// return 'hello' + user.firstName + ' ' + user.lastName
// }
// const greeter1: (user: IUser) => string = (user: IUser): string => {
// return 'hello' + user.firstName + ' ' + user.lastName
// }
// console.log(greeter1({ firstName: '吴', lastName: '大勋'}))
// 用接口定义函数的形状
interface IFn {
(user: IUser): string
}
const greeter1: IFn = (user: IUser): string => {
return 'hello' + user.firstName + ' ' + user.lastName
}
console.log(greeter1({
firstName: '吴', lastName: '大勋'}))
// 参数默认值
function test (a: number, b: number = 10): number {
return a + b
}
// 重载允许一个函数接受不同数量或类型的参数时,作出不同的处理
// 利用联合类型 number | string
// function reverse (x: number | string): number | string {
// if (typeof x === 'number') {
// return Number(x.toString().split('').reverse().join(''))
// } else {
// return x.split('').reverse().join()
// }
// }
// 上述不能够精确的表达,输入为数字的时候,输出也应该为数字,输入为字符串的时候,输出也应该为字符串。
// 使用重载定义多个 `reverse` 的函数类型
// TypeScript 会优先从最前面的函数定义开始匹配,
// 所以多个函数定义如果有包含关系,需要优先把精确的定义写在前面
function reverse (x: number): number // 重载函数的定义
function reverse (x: string): string // 重载函数的定义
function reverse (x: number | string): number | string {
// 重载函数的实现
if (typeof x === 'number') {
return Number(x.toString().split('').reverse().join(''))
} else {
return x.split('').reverse().join()
}
}