函式
函式是 TypeScript 型別檢查最常發揮作用的地方:只要參數與回傳值標好型別,呼叫端打錯型別、少傳參數,編輯器立刻就會提醒。
參數與回傳型別
function add(a: number, b: number): number {
return a + b
}
const multiply = (a: number, b: number): number => a * b
回傳型別通常可以省略、讓 TypeScript 自動推論;但公開的函式(例如給其他模組呼叫的 API)建議明確標出回傳型別,讓介面更清楚,也避免函式內部改動時不小心變更回傳型別而沒發現。
可選參數與預設值
function createUser(name: string, age?: number) {
return { name, age: age ?? 18 }
}
function greet(name: string, greeting: string = "Hello") {
return `${greeting}, ${name}!`
}
createUser("Alice") // OK,age 是 undefined
createUser("Bob", 30) // OK
greet("Carol") // "Hello, Carol!"
? 表示參數可省略,型別會自動變成「原型別 | undefined」;有預設值的參數等於自帶可選,呼叫時不傳就用預設值。可選與有預設值的參數必須放在必要參數後面,這點跟一般 JavaScript 函式一致。
其餘參數(Rest Parameters)
function sum(...nums: number[]): number {
return nums.reduce((total, n) => total + n, 0)
}
sum(1, 2, 3) // 6
sum(1, 2, 3, 4, 5) // 15
...nums: number[] 把多出來的參數收成一個陣列,型別跟一般陣列標法相同。
函式型別(把函式簽章當型別用)
先定義函式的「形狀」(參數與回傳型別),再讓變數套用這個型別;套用之後,subtract 的參數 a、b 就不用再重複標型別,TypeScript 會從 MathOp 推回去。這個寫法在寫 callback、事件處理函式時很常見。
相關影音
Programming with Mosh 這支入門課用不少篇幅講函式參數與型別標註,適合看完本頁後找例子對照。