# 函数的相关约束
> 函数重载: 在函数实现之前,对函数调用的多种情况进行声明
```
/**
* 得到a 和 b 相乘的结果
* @param a
* @param b
*/
function combine(a: number, b: number): number;
/**
* 得到 a 和 b 拼接的结果
* @param a
* @param b
*/
function combine(a: string, b: string): string;
function combine(a: number | string, b: number | string): number | string {
if (typeof a === 'number' && typeof b === "number") {
return a * b;
} else if (typeof a === 'string' && typeof b === 'string') {
return a + b;
}
throw new Error("a和b必须是相同的类型");
}
const a = combine(1,2);
```
> 可选参数:可以在某些参数名后加上问号,表示该参数可以不用传递。可选参数必须在参数列表的末尾。
```
function sum(a: number, b:number = 0, c?:number){
if(c){
return a + b + c;
}else{
return a + b;
}
}
sum(3, 4);
sum(3,4,5);
```