函數
1. 函數聲明
- 函數聲明 (Function Declaration)
function add(x:number, y:number):number{
return x + y
}
- 函數表達式 (Function Expression)
let add = function(x:number, y:number):number{
return x + y
}
// 這種定義方式只定義了匿名函數的傳參要求,並沒有給 add 的參數添加定義,但是這種方式也可以通過編譯,由右側推導出左側參數定義
let add(x:number, y:number) => number = function(x:number, y:number):number{
return x + y
}
// => 表示函數的定義,左邊爲輸入類型(需要用括號擴起來),右邊爲輸出類型
無論是那種函數定義方式,在傳參數時都不能少或者多,如果有可傳可不傳的參數,請看 可選參數 。
2. 接口定義函數
interface IoFuc{
(x:string, y:string):number
}
let getLoc:IoFuc
getLoc = function(x: string, y: string): number {
return x.indexOf(y)
}
3. 可選參數
用 ? 表示可選參數
function buildName(firstName:string, lastName?:string):string{
if(lastName) {
return firstName + lastName
} else {
return firstName
}
}
可選參數必須在必選參數後面
4. 參數默認值
ts 會將有默認值的參數識別爲可選參數,此時它可以在必選參數前面,此時傳值是需要的,若在必選參數後面可以不用傳值,具體如下:
function buildName(firstName:string, lastName:string = 'tom'):string{
return firstName + lastName
}
buildName('Li')
function buildName(lastName:string = 'tom', firstName:string):string{
return firstName + lastName
}
buildName(undefined, 'Wang')
5. 剩餘參數
- es6中 ...rest 獲取函數的剩餘參數,如下:
function indexs(a, ...rest) {
console.log(rest)
}
indexs(1, 2, 4, 5)
// 2 4 5
- 上面例子中可知,rest是一個數組,我們可以用數組類型來定義它。 rest參數一定是截止到最後一個參數!
function push(array:any[], ...rest:any[]):any[] {
rest.forEach(item => {
array.push(item)
})
}
let arr:any[] = []
push(arr, 1, 2, 3, 'd', 'e', 5)
// arr [1, 2, 3, 'd', 'e', 5]
6. 重載
重載允許一個函數接受不同數量或類型的參數是做出不同的處理。
// 實現將一個字符串或數字進行反轉的方法
// 爲了更精準的表達,輸入的是字符串,輸出也應該是字符串,數字同理,所以可以重載定義多個reverseFnc的函數類型
function reverseFnc(x:number):number;
function reverseFnc(x:string):string;
function reverseFnc(x:number|string):number|string{
if(typeof x === 'string') {
return x.split('').reverse().join('')
} else if(typeof x === 'number') {
return Number(x.toString().split('').reverse().join(''))
}
}
在上述例子中,多次重複定義了reverseFnc函數,前幾次屬於函數的定義,最後一次屬於函數的實現。
typescript會優先從最前面的函數定義開始匹配,多個函數如果有包含關係,則應該將更精準的定義寫在前面!