函數 function
在ts中,函數是主要的定義 行爲的地方。 TypeScript爲JavaScript函數添加了額外的功能,讓我們可以更容易地使用。
聲明方式
在 JavaScript 中,有兩種常見的定義函數的方式——函數聲明和函數表達式
函數聲明
一個函數有輸入和輸出,要在 TypeScript 中對其進行約束,需要把輸入和輸出都考慮到。
function sum(x:number,y:number):number{
return x+y
}
函數表達式
let mySum = function (x: number, y: number): number {
return x + y;
};
這兩者是等價的,上面的代碼只對等號右側的匿名函數進行了類型定義,而等號左邊的 mySum,是通過賦值操作進行類型推論而推斷出來的
let mySum: (x: number, y: number) => number = function (x: number, y: number): number {
return x + y;
};
注意:
- 輸入多餘的(或者少於要求的)參數,是不被允許的,會報錯
- 在 TypeScript 的類型定義中,=> 用來表示函數的定義,左邊是輸入類型,需要用括號括起來,右邊是輸出類型。
可選參數
與接口中的可選屬性類似,我們用 ? 表示可選的參數。需要注意的是,可選參數必須接在必需參數後面。換句話說,可選參數後面不允許再出現必需參數了
let myName :(firstName:string,lastName?:string)=>void = function(firstName:string,lastName?:string):void{
if (lastName) {
console.log(firstName + ' ' + lastName);
} else {
console.log(firstName);
}
}
默認參數
可以按照平常的js給參數添加默認值,TypeScript 會將添加了默認值的參數識別爲可選參數,同時這樣也不受‘可選參數必須接在必需參數後面’的限制了。
function buildName(firstName: string = 'Tom', lastName: string) {
return firstName + ' ' + lastName;
}
let tomcat = buildName('Tom', 'Cat');
let cat = buildName(undefined, 'Cat');
剩餘參數
在js中,arguments可以代表函數的所有的參數,可以在函數內獲取所有參數。ES6 中,可以使用 ...rest 的方式獲取函數中的剩餘參數(rest 參數)。同樣的,ts也是支持...rest的方式。
function push(array: any[], ...items: any[]) {
items.forEach(function(item) {
array.push(item);
});
}
let a_function:number[] = [1,2,3];
push(a_function, 1, 2, 3);
剩餘參數本身就是個數組,也需要進行類型聲明。
函數重載
什麼是函數重載:兩個以上的函數,具有相同的函數名,但是形參的個數或者類型不同,編譯器根據實參和形參的類型及個數的最佳匹配,自動確定調用哪一個函數,這就是函數的重載。
function reverse(x: number): number;
function reverse(x: string): string;
function reverse(x: any): any{
if (typeof x === 'number') {
return Number(x.toString().split('').reverse().join(''));
} else if (typeof x === 'string') {
return x.split('').reverse().join('');
}
}
上例中,我們重複定義了多次函數 reverse,前幾次都是函數定義,最後一次是函數實現。在編輯器的代碼提示中,可以正確的看到前兩個提示。
注意,TypeScript 會優先從最前面的函數定義開始匹配,所以多個函數定義如果有包含關係,需要優先把精確的定義寫在前面。
this
在js中this可以通過上下文得知this的指向,在ts中,若不表明類型則容易報錯。
- 在普通的函數裏,可以在參數列表裏最前面添加this:any,指定假的參數,不影響
- 在class中,可以在參數列表中this可以指定當前的class類
總結
emmm,開頭的一句話:TypeScript爲JavaScript函數添加了額外的功能,讓我們可以更容易地使用,還有規範
我把筆記和例子放到GitHub裏了,如需要可以去看看,有什麼不對的地方,歡迎指正,大家一起進步加油。