函數 函數是 JavaScript 應用程式的基礎,它幫助你實現抽象層,模擬類,信息隱藏和模塊。在 TypeScript 里,雖然已經支持類,命名空間和模塊,但函數仍然是主要的定義行為的地方。TypeScript 為 JavaScript 函數添加了額外的功能,讓我們可以更容易地使用。 基本示例 和 ...
函數
函數是 JavaScript
應用程式的基礎,它幫助你實現抽象層,模擬類,信息隱藏和模塊。在 TypeScript
里,雖然已經支持類,命名空間和模塊,但函數仍然是主要的定義行為的地方。TypeScript 為 JavaScript 函數添加了額外的功能,讓我們可以更容易地使用。
基本示例
和 JavaScript 一樣,TypeScript 函數可以創建有名字的函數和匿名函數。你可以隨意選擇適合應用程式的方式,不論是定義一系列 API 函數還是只使用一次的函數。
// 命名函數
function add(x, y) {
return x + y
}
// 匿名函數
let myAdd = function(x, y) {
return x + y;
}
函數類型
為函數定義類型
讓我們為上面那個函數添加類型:
function add(x: number, y: number): number {
return x + y
}
let myAdd = function(x: number, y: number): number {
return x + y
}
我們可以給每個參數添加類型之後再為函數本身添加返回值類型。TypeScript 能夠根據返回語句自動推斷出返回值類型。
書寫完整函數類型
現在我們已經為函數指定了類型,下麵讓我們寫出函數的完整類型。
// 函數的完整寫法
// myAdd2---->變數名----函數myAdd2
// (x: number, y: number) => number 是當前這個函數的類型
// function(x: number, y: number): number { return x + y } 相當於符合上面這個函數的值
let myAdd2: (x: number, y: number) => number =
function(x: number, y: number): number {
return x + y
}
可選參數和預設參數
TypeScript
里的每個函數參數都是必須的。 這不是指不能傳遞 null
或 undefined
作為參數,而是說編譯器檢查用戶是否為每個參數都傳入了值。編譯器還會假設只有這些參數會被傳遞進函數。 簡短地說,傳遞給一個函數的參數個數必須與函數期望的參數個數一致。
JavaScript
里,每個參數都是可選的,可傳可不傳。 沒傳參的時候,它的值就是 undefined
。 在TypeScript 里我們可以在參數名旁使用 ?
實現可選參數的功能。 比如,我們想讓 lastName
是可選的
在 TypeScript
里,我們也可以為參數提供一個預設值當用戶沒有傳遞這個參數或傳遞的值是 undefined
時。 它們叫做有預設初始化值的參數。 讓我們修改上例,把firstName
的預設值設置為 "A"
。
function buildName(firstName: string='A', lastName?: string): string {
if (lastName) {
return firstName + '-' + lastName
} else {
return firstName
}
}
// 都傳入
console.log(buildName('C', 'D'))
// 只傳入姓
console.log(buildName('C'))
// 什麼也不傳
console.log(buildName())
剩餘參數
必要參數,預設參數和可選參數有個共同點:它們表示某一個參數。 有時,你想同時操作多個參數,或者你並不知道會有多少參數傳遞進來。 在 JavaScript
里,你可以使用 arguments
來訪問所有傳入的參數
在 TypeScript 里,你可以把所有參數收集到一個變數里:
剩餘參數會被當做個數不限的可選參數。 可以一個都沒有,同樣也可以有任意個。 編譯器創建參數數組,名字是你在省略號( ...)
後面給定的名字,你可以在函數體內使用這個數組。
function info(x: string, ...args: string[]) {
console.log(x, args)
}
info('abc', 'c', 'b', 'a')
函數重載
函數重載: 函數名相同, 而形參不同的多個函數
在JS中, 由於弱類型的特點和形參與實參可以不匹配, 是沒有函數重載這一說的 但在TS中, 與其它面向對象的語言(如Java)就存在此語法
/*
函數重載: 函數名相同, 而形參不同的多個函數
需求: 我們有一個add函數,它可以接收2個string類型的參數進行拼接,也可以接收2個number類型的參數進行相加
*/
// 重載函數聲明
function add (x: string, y: string): string
function add (x: number, y: number): number
// 定義函數實現
function add(x: string | number, y: string | number): string | number {
// 在實現上我們要註意嚴格判斷兩個參數的類型是否相等,而不能簡單的寫一個 x + y
if (typeof x === 'string' && typeof y === 'string') {
return x + y
} else if (typeof x === 'number' && typeof y === 'number') {
return x + y
}
}
console.log(add(1, 2))
console.log(add('a', 'b'))