主题
函数和重载
函数定义
- 函数声明
typescript
function fn(x: number, y?: number): number {
return ( y ? x + y : x)
}
- 函数表达式
typescript
const fn = (x: number, y?: number): number => y ? x + y : x
- 用
interface
定义一个公用函数类型
typescript
interface ISum {
(x: number, y: number): number
}
const sum: ISum = (x, y) => x + y
- 用
type
定义一个公用函数类型
typescript
type Sum = (x: number, y: number) => number
- 使用关键字
?
定义参数为可选,可选参数只能定义在必选参数后面
typescript
function fn (one: number, two: string, three?: boolean) {}
- 参数默认值
typescript
function fn (one: number, two: string = 'kingmusi') {}
- Rest 参数
typescript
function fn (...item: number[]) {}
重载
ts 中的重载不同于 Java 中的重载,ts 中的重载是为了更好的解决自动类型推断不够准确的问题
有以下函数
typescript
type NumOrStr = number | string
function add(a: NumOrStr, b:NumOrStr) {
// 可以看到,类型还是需要自己在函数中判断,否则会报错
if (typeof a === 'string' || typeof b === 'string') {
return a.toString() + b.toString()
}
return a + b
}
当使用两个字符串作为参数调用 add 函数时,我们很容易知道此时返回一个字符串,所以想使用字符串的 split 方法,但 ts 却会报错
typescript
add('x', 'y').split('') // Property 'split' does not exist on type 'number'
因为 ts 的自动推断并没有这么智能,它认为结果会是 number 或者 string,而 number 并没有 split 方法
那如何解决这烦人的报错呢?使用 ts 的函数重载
typescript
type NumOrStr = number | string
function add(a:number,b:number):number;
function add(a: string, b: string): string;
function add(a: string, b: number): string;
function add(a: number, b: string): string;
function add(a:Types, b:Types) {
if (typeof a === 'string' || typeof b === 'string') {
return a.toString() + b.toString();
}
return a + b;
}
const result = add('x', ' y');
result.split(' ');