函数
介绍
通过函数可以实现抽象层、模拟类、信息隐藏和模块。typeScript支持类、命名空间和模块。但函数任然是主要定义行为的地方。
函数类型
为函数定义类型
function add(x: number, y: number): number {return x + y;}let myAdd = function(x: number, y: number): number { return x + y; };
书写完整函数类型
let myAdd: (x: number, y: number) => number = function (x: number, y: number): number {return x + y};let myAdd2: (baseValue: number, increment: number) => number = function (x: number, y: number): number {return x + y};
推断类型
// myAdd has the full function typelet myAdd = function(x: number, y: number): number { return x + y; };// The parameters `x` and `y` have the type numberlet myAdd: (baseValue: number, increment: number) => number =function(x, y) { return x + y; };
可选参数与默认参数
可选参数必须在参数的最后
function buildName(firstName: string, lastName?: string) {if (lastName)return firstName + " " + lastName;elsereturn firstName;}
有默认初始化值的参数,当用户没有传递参数或者传递的值是undefined时,参数会取得默认值,参数默认值没有位置要求。但是如果带默认值的出现在不带默认值的前面,必须用undefined值来获得默认值。
function buildName(firstName: string, lastName = "Smith") {// ...}function buildName(firstName = "Will", lastName: string) {return firstName + " " + lastName;}let result1 = buildName("Bob"); // error, too few parameterslet result2 = buildName("Bob", "Adams", "Sr."); // error, too many parameterslet result3 = buildName("Bob", "Adams"); // okay and returns "Bob Adams"let result4 = buildName(undefined, "Adams"); // okay and returns "Will Adams"
剩余参数
function buildName(firstName: string, ...restOfName: string[]) {return firstName + " " + restOfName.join(" ");}let employeeName = buildName("Joseph", "Samuel", "Lucas", "MacKinzie");
function buildName(firstName: string, ...restOfName: string[]) {return firstName + " " + restOfName.join(" ");}let buildNameFun: (fname: string, ...rest: string[]) => string = buildName;
this和箭头函数
基本同JavaScript
重载
方法是为同一个函数提供多个函数类型定义来进行函数重载
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);
