声明函数
- 通过变量声明:
typescript
let add: (x: number, y: number) => number
- 通过接口声明:
typescript
interface Add {
(x: number, y: number): number
}
- 通过类型别名声明:
typescript
type Add = (x:number , y: number) => number
type
和 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)
}
}