# 函数

函数是 JavaScript 应用程序的基础,它帮助你实现抽象层,模拟类,信息隐藏和模块。在 TypeScript 里,虽然已经支持类,命名空间和模块,但函数仍然是主要的定义行为的地方。TypeScript 为 JavaScript 函数添加了额外的功能,让我们可以更容易地使用。

  • TypeSCript中函数实参,形参个数必须一一对应,且类型也一一对应。
  • 函数必选参数不能位于可选参数之后。
  • 函数必选参数前的参数如果要取默认值需要赋值undefined占位,必选参数后的参数获取默认值不需要传undefined。
  • 在 JavaScript 里,你可以使用 arguments 来访问所有传入的参数。在 TypeScript 里,你可以把所有参数收集到一个变量里,剩余参数会被当做个数不限的可选参数。
// 使用变量定义函数类型
let add1: (x: number, y: number) => number

// 使用类型别名定义函数类型
type add2 = (x: number, y: number) => number

// 使用函数类型接口定义函数类型
interface add3 {
    (x: number, y: number): number
}

// TypeScript 的类型系统会推断出参数类型,函数的返回值类型是通过其返回值推断出来的
let add: add3 = (x, y) => x + y;

// 应有 2 个参数,但获得 3 个。
add(1,2,3)

// 必选参数不能位于可选参数后。
function add4(x:number,y?:number,z:number){
    return y ? x + y : x;
}

// 必选参数前的参数如果要取默认值需要赋值undefined占位,必选参数后的参数获取默认值不需要传undefined
function add5(x: number, y = 0, z: number, q = 1) {
  return x + y + z + q;
}
// 5
console.log(add5(1, undefined, 3));

# 函数重载

在C++或者java等静态语言中,两个函数名称相同,但是参数类型不同或者参数个数不同,就实现了函数重载。

函数重载的好处是:不需要为功能相似的函数起不同的名称,增强了函数的可读性。

函数重载一般在实现时用any类型

编译器选择正确的检查类型时,它查找重载列表,尝试使用第一个重载定义。 如果匹配的话就使用这个。因此,在定义重载的时候,一定要把最精确的定义放在最前面。

function add(...rest: number[]): number;
function add(...rest: string[]): string;
function add(...rest: any[]) {
    let first = rest[0];
    if (typeof first === 'number') {
        return rest.reduce((pre, cur) => pre + cur);
    }
    if (typeof first === 'string') {
        return rest.join('');
    }
}
console.log(add(1, 2)) //3 
console.log(add('a', 'b', 'c')) // 'abc'

# 参考

更新时间: 5/13/2020, 11:23:00 PM