一、函数定义
function 函数名(): 返回值类型 {} // 如果函数没有返回值,则定义为 void
let 变量名: 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 card
if (typeof x == "object") {
let pickedCard = Math.floor(Math.random() * x.length);
return pickedCard;
}
// Otherwise just let them pick the card
else 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
会产生错误。