1. 函數聲明es6
function add(x:number, y:number):number{ return x + y }
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 } // => 表示函數的定義,左邊爲輸入類型(須要用括號擴起來),右邊爲輸出類型
不管是那種函數定義方式,在傳參數時都不能少或者多,若是有可傳可不傳的參數,請看 可選參數 。 typescript
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 } }
可選參數必須在必選參數後面ui
4. 參數默認值spa
ts 會將有默認值的參數識別爲可選參數,此時它能夠在必選參數前面,此時傳值是須要的,若在必選參數後面能夠不用傳值,具體以下:rest
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. 剩餘參數code
function indexs(a, ...rest) { console.log(rest) } indexs(1, 2, 4, 5) // 2 4 5
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. 重載blog
重載容許一個函數接受不一樣數量或類型的參數是作出不一樣的處理。
// 實現將一個字符串或數字進行反轉的方法 // 爲了更精準的表達,輸入的是字符串,輸出也應該是字符串,數字同理,因此能夠重載定義多個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會優先從最前面的函數定義開始匹配,多個函數若是有包含關係,則應該將更精準的定義寫在前面!