一、函数定义
function 函数名(): 返回值类型 {} // 如果函数没有返回值,则定义为 voidlet 变量名: Function = 函数名(): 返回值类型 {};// 函数声明法function func(): string {return 'function'}// 匿名函数let func = function(): number {return 123;}
二、形参类型
实参和形参的类型和数量要一样。
function 函数名(形参1: 类型, 形参2: 类型): 返回值类型 {}let 变量名: 变量类型 = 函数名(实参1, 实参2);
三、可选参数
参数可传可不传
function 函数名(形参 ? : 类型) : 返回值类型 {}
四、默认值
带默认值的参数,本身也是可选的,因此可以不用写  ?  
function 函数名(形参: 类型 = 默认值) : 返回值类型 {}函数名(undefined, 实参2); ===> 函数名(默认值1, 实参2);
五、剩余参数
- 剩余参数只能定义有一个
 - 剩余参数只能定义为数组
 - 剩余参数只能定义在形参列表最后
function add(形参1: 类型, 形参2: 类型, ...形参3: 类型[]) :返回值类型 {}
六、函数重载
java中方法的重载:指的是两个或两个以上同名函数,但它们的参数不一样,这时会出现函数重载的情况TypeScript中的重载:通过为一个函数提供多个函数类型定义来实现多种功能的目的ts为了兼容es5以及es6,重载的写法和java中有区别es5/6中出现同名函数会出现覆盖。
 
let suits = ["hearts", "spades", "clubs", "diamonds"];function pickCard(x: { suit: string; card: number; }[]): number;function pickCard(x: number): { suit: string; card: number; };function pickCard(x): any {// Check to see if we're working with an object/array// if so, they gave us the deck and we'll pick the cardif (typeof x == "object") {let pickedCard = Math.floor(Math.random() * x.length);return pickedCard;}// Otherwise just let them pick the cardelse if (typeof x == "number") {let pickedSuit = Math.floor(x / 13);return { suit: suits[pickedSuit], card: x % 13 };}}let myDeck = [{ suit: "diamonds", card: 2 }, { suit: "spades", card: 10 }, { suit: "hearts", card: 4 }];let pickedCard1 = myDeck[pickCard(myDeck)];alert("card: " + pickedCard1.card + " of " + pickedCard1.suit);let pickedCard2 = pickCard(15);alert("card: " + pickedCard2.card + " of " + pickedCard2.suit);
为了让编译器能够选择正确的检查类型,它与 JavaScript 里的处理流程相似。 它查找重载列表,尝试使用第一个重载定义。 如果匹配的话就使用这个。 因此,在定义重载的时候,一定要把最精确的定义放在最前面。
注意,function pickCard(x): any并不是重载列表的一部分,因此这里只有两个重载:一个是接收对象,另一个接收数字。 以其它参数调用 pickCard会产生错误。
