声明函数 
- 通过变量声明:
 
typescript
let add: (x: number, y: number) => number- 通过接口声明:
 
typescript
interface Add {
     (x: number, y: number): number
 }- 通过类型别名声明:
 
typescript
type Add = (x:number , y: number) => numbertype 和 interface 多数情况下有相同的功能,就是定义类型。
TIP
type:不是创建新的类型,只是为一个给定的类型起一个名字。type还可以进行联合、交叉等操作,引用起来更简洁。
interface:创建新的类型,接口之间还可以继承、声明合并。
建议优先使用 interface。
混合接口 
声明:
typescript
interface Lib {
    (): void;
    version: string;
    doSomeThing(): void;
}构造器:
typescript
function getLib() {
    let lib: Lib = (() => {}) as Lib
    lib.version = '1.0'
    lib.doSomeThing = () => {}
    return lib;
}使用:
typescript
let lib1 = getLib();
lib1();
lib1.doSomeThing();
let lib2 = getLib();可选参数 
通过 ? 来声明。
typescript
function add5(x: number, y?: number) {
    return y? x + y : x;
}剩余参数
typescript
function add6(x: number, ... rest: number[]) {
    return x + rest.reduce((pre, cur) => pre + cur) 
}参数默认值:
typescript
function add7(x: number, y = 0, z: number, q =1) {
    return x + y + z + q;
}
add6(1, undefined, 3)注意:
必选参数前面的默认参数是不可省略的,需传入 undefined 来获取它的默认值; 必选参数后面的默认参数是可以省略的。
函数重载 
函数重载的好处:不需要为功能相似的函数起不同的名称。
ts 实现函数重载的时候,要求定义一系列的函数声明
typescript
function add8(...rest: number[]): number;
function add8(...rest: string[]): string;
function add8(...rest: any[]): any {
    let first = rest[0];
    if(typeof first === 'string') {
        return rest.join('')
    }
    if(typeof first === 'number') {
        return rest.reduce((pre, cur) => pre + cur)
    }
}
前端小册