TypeScript--函數聲明


函數聲明

示例

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM