TypeScript 中如何聲明函數(shù)?
TypeScript 中如何聲明函數(shù)
函數(shù)(在對象中又叫做方法),是編碼中最普遍存在和使用的一種對象。本節(jié)學(xué)習(xí)如何在 TypeScript 中聲明函數(shù),方便我們開發(fā)。
將從以下 6 個方面來講:類型表達式、調(diào)用簽名、構(gòu)造簽名、函數(shù)重載、泛型函數(shù)、可選參數(shù)。
一、類型表達式(Function Type Expressions)
函數(shù)類型表達式(Function Type Expressions)是最簡單聲明函數(shù)的方式。語法類似 (s: string) => void
,使用胖箭頭 =>
分隔參數(shù)列表和返回值類型。
二、調(diào)用簽名(Call Signatures)
這是為了滿足聲明那些包含屬性的函數(shù)。JavaScript 中函數(shù)就是一類特殊的對象。
比如我們有一個函數(shù) doSomething
,接收一個函數(shù)類型參數(shù) fn
,fn
類型如下:
接收一個數(shù)值類型
number
的參數(shù)調(diào)用,返回布爾類型還包含一個字符串類型屬性
description
注意,這里聲明函數(shù)使用的是冒號 :
而非胖箭頭 =>
,對象類型中是采用 k: v
形式指定鍵值對的。
三、構(gòu)造簽名(Construct Signatures)
構(gòu)造函數(shù)聲明類似函數(shù)調(diào)用聲明,不過多了一個 new
前綴。
當(dāng)然,調(diào)用簽名和構(gòu)造簽名可以同時使用,
四、函數(shù)重載(Function Overloads)
有時某個函數(shù)可能要支持不同參數(shù)的調(diào)用形式。假設(shè)有一個函數(shù) makeDate()
來說:
既支持通過時間戳(
number
類似)來創(chuàng)建日期對象也支持通過月(
m
)、日(d
)、年(y
)來創(chuàng)建日期對象
如何定義這個 makeDate()
函數(shù)?
這時候就要用到函數(shù)重載了。
五、泛型函數(shù)(Generic Functions)
設(shè)想這樣一個場景,我有一個函數(shù),獲取數(shù)組的第一個元素。返回值類型取決于傳入的數(shù)組。
比如:傳入的是 number[]
類型,那么返回 number
;傳入的是 string[]
類型,那么返回 string
。
我們可以用函數(shù)重載來實現(xiàn):
但不夠靈活。因為返回值類型取決于傳入的數(shù)組,所以我們可以抽象出一個泛型 T
來表示數(shù)組元素類型。
泛型 T
是一種特殊的類型,依賴實際調(diào)用場景。函數(shù)中泛型的聲明放在函數(shù)名之后,用尖括號 <>
包裹。
對應(yīng)到本例,我們聲明了一個函數(shù) firstElem2
,其接收一個元素類型為“T”的數(shù)組,函數(shù)返回值類型關(guān)聯(lián)數(shù)組元素類型——返回 T
(有元素) 或者 undefined
(無元素)。
當(dāng)我們使用 [1, 2, 3, 4]
調(diào)用 firstElem2()
函數(shù)時,TypeScript 推導(dǎo)泛型 T
即是 number
類型,繼而推導(dǎo)返回類型為 number | undefiend
。后續(xù)使用 ['1', '2', '3', '4']
以及 [true, false]
調(diào)用,原理類似。
使用泛型可以簡化我們的函數(shù)類型聲明。
當(dāng)然,還能「同時使用多個泛型、對泛型類型做約束」:
使用多個泛型
泛型間使用逗號隔開。
對泛型類型做約束
使用 extends
關(guān)鍵字來約束泛型范圍。
六、可選參數(shù)(Optional Parameters)
與在 interface
中聲明對象類型的可選屬性類似,可選參數(shù)也是使用的 ?: