在 TypeScript 中,函式的定義與 JavaScript 非常類似,可以用 function
關鍵字來宣告函式,同時我們可以為參數和回傳值指定明確的型別,以確保程式的健全性:
// 基本函式宣告與型別註記
function functionName(parameter: type, parameter: type): returnType {
// return something
}
// 範例:加法函式
function sum(x: number, y: number): number {
return x + y;
}
當我們呼叫 sum
函式時,如果傳入的參數型別不符 TypeScript 的定義,編譯器會給出錯誤提示:
// 正確的型別
console.log(sum(1, 1)); // 2
// 錯誤的型別
console.log(sum("3", 1)); // error: Argument of type 'string' is not assignable to parameter of type 'number'
如果我們定義的函式不需要回傳任何值,則可以使用 void
型別。這樣可以明確表示函式內部沒有回傳值,並阻止呼叫方試圖將函式結果指派給變數:
// 不回傳任何值的函式
function print(name: string): void {
console.log(name);
}
有時我們可能會忽略函式的回傳值型別註記,例如:
// 沒有明確指定回傳型別
function sum(x: number, y: number) {
return x + y;
}
在這種情況下,TypeScript 會根據函式的邏輯自動推斷回傳型別。在這個例子中,編譯器會推斷出回傳型別是 number
。然而,如果函式內部有不同的回傳邏輯,回傳的型別可能會被推斷為 union
型別,甚至是 any
型別。因此,為了程式的可讀性與維護性,盡量為每個函式加上明確的型別註記是個良好的習慣。
TypeScript 也支援使用箭頭函式語法來簡化函式的定義,同時保留型別註記:
// 使用箭頭函式
const multiply = (x: number, y: number): number => {
return x * y;
}
此外,我們可以定義可選參數與預設參數。可選參數使用 ?
來表示,而預設參數可以直接在參數後面賦值:
// 可選參數
function greet(name: string, greeting?: string): string {
return `${greeting || 'Hello'}, ${name}`;
}
// 預設參數
function greetWithDefault(name: string, greeting: string = 'Hello'): string {
return `${greeting}, ${name}`;
}
console.log(greet('Annie')); // "Hello, Annie"
console.log(greet('Annie', 'Hi')); // "Hi, Annie"
console.log(greetWithDefault('Tina')); // "Hello, Tina"
當處理函式型別時,我們也可以定義具有多個參數和回傳型別的函式型別。這樣可以用來更靈活地管理函式,尤其是在建立複雜的應用程式時:
// 函式型別宣告
type MathOperation = (a: number, b: number) => number;
// 使用函式型別
const add: MathOperation = (a, b) => a + b;
const subtract: MathOperation = (a, b) => a - b;
console.log(add(6, 4)); // 10
console.log(subtract(7, 3)); // 4
函式型別在 TypeScript 中是一個強大的工具,它不僅能提供更強的型別安全性,還能提高程式的可讀性與可維護性。通過合理的型別註記與應用,我們可以撰寫出更加健壯且易於理解的程式碼。無論是傳統的函式定義、箭頭函式還是進階的函式型別,都能讓我們的程式設計更加靈活和高效。