函數聲明
示例
function sum(x: number, y: number): number {
return x + y
}
// ✅正確
sum(2, 4)
// ❌錯誤
// Expected 2 arguments, but got 3.
sum(2, 4, 5)
// ❌錯誤
// Expected 2 arguments, but got 1.
// An argument for 'y' was not provided.
sum(2)
函數表達式
示例
const sum = function(x: number, y: number): number {
return x + y
}
// ✅正確
sum(2, 4)
// ❌錯誤
// Expected 2 arguments, but got 3.
sum(2, 4, 5)
// ❌錯誤
// Expected 2 arguments, but got 1.
// An argument for 'y' was not provided.
sum(2)
事實上,上面的代碼只對等號右側的匿名函數進行了類型定義,而等號左邊的 sum
,是通過賦值操作進行類型推論而推斷出來的。
// 手動添加類型
const sum: (x: number, y: number) => number = function(x: number, y: number): number {
return x + y
}
// ✅正確
sum(2, 4)
// ❌錯誤
// Expected 2 arguments, but got 3.
sum(2, 4, 5)
// ❌錯誤
// Expected 2 arguments, but got 1.
// An argument for 'y' was not provided.
sum(2)
在 TypeScript
的類型定義中,=>
用來表示函數的定義,左邊是輸入類型,右邊是輸出類型。
用接口定義函數的形狀
interface Sum {
(x: number, y: number): number
}
const sum: Sum = function (x: number, y: number) {
return x + y
}
// ✅正確
sum(2, 4)
// ❌錯誤
// Expected 2 arguments, but got 3.
sum(2, 4, 5)
// ❌錯誤
// Expected 2 arguments, but got 1.
// An argument for 'y' was not provided.
sum(2)
可選參數
與接口中的可選屬性類似,我們用 ?
表示可選的參數
function sum(x: number, y?: number): number {
return y ? x + y : x
}
// ✅正確
sum(2)
// ✅正確
sum(2, 4)
注意:可選參數必須接在必需參數后面
// ❌錯誤
// A required parameter cannot follow an optional
function sum(x?: number, y: number): number {
return x ? x + y : y
}
參數默認值
TypeScript
會將添加了默認值的參數識別為可選參數
function sum(x: number = 1, y: number): number {
return x + y
}
// ✅正確
sum(2, 4)
補充:類型推論
如果沒有明確的指定類型,那么 TypeScript
會依照類型推論(Type Inference
)的規則推斷出一個類型。
示例
let userName = 'Tom'
// ✅正確
userName = 'John'
// ❌錯誤
// Type 'number' is not assignable to type 'string'.
userName = 100
雖然 userName
沒有指定類型,但是初始值 'Tom'
為字符串,所以推論 userName
的類型為字符串。
事實上,它等價於:
let userName: string = 'Tom'
// ✅正確
userName = 'John'
// ❌錯誤
// Type 'number' is not assignable to type 'string'.
userName = 123
如果定義的時候沒有賦值,不管之后有沒有賦值,都會被推斷成 any
類型而完全不被類型檢查
let userName
// ✅正確
userName = 'John'
// ✅正確
userName = false
// ✅正確
userName = 100