一、是什麼
函式是JavaScript
應用程式的基礎,幫助我們實現抽象層、模擬類、資訊隱藏和模組
在TypeScript
裡,雖然已經支援類、名稱空間和模組,但函式仍然是主要定義行為的方式,TypeScript
為 JavaScript
函式新增了額外的功能,豐富了更多的應用場景
函式型別在 TypeScript
型別系統中扮演著非常重要的角色,它們是可組合系統的核心構建塊
二、使用方式
跟javascript
定義函式十分相似,可以通過funciton
關鍵字、箭頭函式等形式去定義,例如下面一個簡單的加法函式:
const add = (a: number, b: number) => a + b
上述只定義了函式的兩個引數型別,這個時候整個函式雖然沒有被顯式定義,但是實際上TypeScript
編譯器是能夠通過型別推斷到這個函式的型別,如下所示:
const add: (a:number, b:number)=>number
const add=(a:number,b:number)=>a+b
當滑鼠放置在第三行add
函式名的時候,會出現完整的函式定義型別,通過:
的形式來定義引數型別,通過 =>
連線引數和返回值型別
當我們沒有提供函式實現的情況下,有兩種宣告函式型別的方式,如下所示:
// 方式一
type LongHand = {
(a: number): number;
};
// 方式二
type ShortHand = (a: number) => number;
當存在函式過載時,只能使用方式一的形式
可選引數
當函式的引數可能是不存在的,只需要在引數後面加上 ?
代表引數可能不存在,如下:
const add = (a: number, b?: number) => a + (b ? b : 0)
這時候引數b
可以是number
型別或者undefined
型別,即可以傳一個number
型別或者不傳都可以
剩餘型別
剩餘引數與JavaScript
的語法類似,需要用 ...
來表示剩餘引數
如果剩餘引數 rest
是一個由number
型別組成的陣列,則如下表示:
const add = (a: number, ...rest: number[]) => rest.reduce(((a, b) => a + b), a)
函式過載
允許建立數項名稱相同但輸入輸出型別或個數不同的子程式,它可以簡單地稱為一個單獨功能可以執行多項任務的能力
關於typescript
函式過載,必須要把精確的定義放在前面,最後函式實現時,需要使用 |
操作符或者?
操作符,把所有可能的輸入型別全部包含進去,用於具體實現
這裡的函式過載也只是多個函式的宣告,具體的邏輯還需要自己去寫,typescript
並不會真的將你的多個重名 function
的函式體進行合併
例如我們有一個add函式,它可以接收 string
型別的引數進行拼接,也可以接收 number
型別的引數進行相加,如下:
// 上邊是宣告
function add (arg1: string, arg2: string): string
function add (arg1: number, arg2: number): number
// 因為我們在下邊有具體函式的實現,所以這裡並不需要新增 declare 關鍵字
// 下邊是實現
function add (arg1: string | number, arg2: string | number) {
// 在實現上我們要注意嚴格判斷兩個引數的型別是否相等,而不能簡單的寫一個 arg1 + arg2
if (typeof arg1 === 'string' && typeof arg2 === 'string') {
return arg1 + arg2
} else if (typeof arg1 === 'number' && typeof arg2 === 'number') {
return arg1 + arg2
}
}
三、區別
從上面可以看到:
- 從定義的方式而言,typescript 宣告函式需要定義引數型別或者宣告返回值型別
- typescript 在引數中,新增可選引數供使用者選擇
- typescript 增添函式過載功能,使用者只需要通過檢視函式宣告的方式,即可知道函式傳遞的引數個數以及型別