TypeScript 高級語法——函數(shù)

????前文沒有提到普通的TS函數(shù)寫法,但是在示例里卻有使用,在這一章詳細(xì)說明一下TS函數(shù)。
????上述示例是三種TS函數(shù)聲明的一種,這種聲明方法被稱為具名函數(shù)聲明,其特點是會獲得“頂級提升”,在同一上下文中,無論聲明順序先后,都可以自由的使用該函數(shù)。
????函數(shù)聲明由“function”關(guān)鍵字開頭,funcName為函數(shù)名,函數(shù)名后的括號內(nèi)是函數(shù)的參數(shù)組成部分。
????參數(shù)的寫法是:“參數(shù)名 : 參數(shù)類型”,函數(shù)支持多個參數(shù),參數(shù)之間以逗號間隔,參數(shù)的類型可以是基礎(chǔ)類型(string,number等),也可以是interface或者type或者直接臨時類型標(biāo)注(見上例temFunc函數(shù))。restFunc函數(shù)展示的是一種特殊的函數(shù)參數(shù)聲明方式:“剩余參數(shù)”,在函數(shù)的參數(shù)名前加“...”標(biāo)記該參數(shù)被聲明為剩余參數(shù),剩余參數(shù)的類型一定是數(shù)組(因為除了參數(shù)a以外被傳入的所有參數(shù)都會作為rest的內(nèi)容存在)。在TS中因為開啟了嚴(yán)格模式所以禁止使用arguments關(guān)鍵字,所以想使用類似arguments的功能只能使用ES標(biāo)準(zhǔn)中引入的剩余參數(shù)語法,其對比arguments的優(yōu)點是可以認(rèn)為的規(guī)定從哪個參數(shù)位置起算作剩余參數(shù)的組成部分,在restFunc示例中同時存在參數(shù)“a : string”和“rest : any[ ]”,也就是說從第二位起算作rest參數(shù)的組成部分。rest在此例中被標(biāo)記為any數(shù)組只是表示任何類型的參數(shù)都可以被傳入剩余參數(shù),這點要視實際使用情況決定,這里如果可預(yù)判的rest的組成一定都是數(shù)字那么rest的類型就可以是number[ ]。
????在函數(shù)參數(shù)的聲明之后緊跟的部分是函數(shù)的返回值部分,返回值聲明的寫法是冒號加返回值類型,絕大多數(shù)情況下返回值是可省略的,因為TS會根據(jù)函數(shù)體內(nèi)的邏輯判斷出返回值的類型(如temFunc,restFunc)。
????這個示例演示的是具有默認(rèn)值的函數(shù)參數(shù)(paramOne)和可選參數(shù)(paramTwo)。具有默認(rèn)值的參數(shù)寫法是在參數(shù)名后使用“=”后加默認(rèn)值,在實際使用參數(shù)時如果未傳入該參數(shù)則默認(rèn)值生效。具有默認(rèn)值的參數(shù)可以省略參數(shù)類型聲明,因為默認(rèn)值的類型幾乎就可以表示參數(shù)類型;可選參數(shù)聲明方式是“?:”,與普通參數(shù)聲明相比冒號前面多了問號,在實際使用時可選參數(shù)未被傳入則參數(shù)值為“undefined”,所以paramTwo的類型實際為“string | undefined”聯(lián)合類型。
????上例表示的為匿名函數(shù)的聲明方式,幾乎具名函數(shù)所有的功能都可以用在匿名函數(shù)上,與具名函數(shù)聲明不同的是省略掉了聲明中的函數(shù)名稱部分,將函數(shù)聲明的結(jié)果賦給一個字段。這種聲明方式不會獲得頂級提升,因為我們現(xiàn)在用一個字段引用一個匿名函數(shù),遵循的是字段聲明的規(guī)則(先定義,再使用)。
????上例為箭頭函數(shù)的聲明方式,箭頭函數(shù)去掉了function關(guān)鍵字,使用表達(dá)式中間的“=>”表示自己的語法。箭頭函數(shù)與匿名函數(shù)幾乎相同,唯一的區(qū)別在于函數(shù)內(nèi)“this”的判定上,以function關(guān)鍵字聲明的函數(shù),函數(shù)體內(nèi)部的this指向其調(diào)用者(a.b( )中函數(shù)b內(nèi)的this為a),箭頭函數(shù)函數(shù)體內(nèi)部的this指向函數(shù)聲明所處上下文的this,在vue項目中我們經(jīng)常使用箭頭函數(shù)規(guī)避以聲明that、self、_this等約定字段對this的臨時存儲。
????當(dāng)箭頭函數(shù)的函數(shù)體極其簡單,只有返回表達(dá)式時,可以簡寫為示例中simple的形式。
????我們在這個例子中演示了如何標(biāo)記以function關(guān)鍵字聲明的函數(shù)的this(在第一個參數(shù)的位置將參數(shù)名起名為this,并標(biāo)記this的類型,示例中為number),這樣我們就能在函數(shù)體內(nèi)部為this的使用加入TS類型系統(tǒng)為我們提供的能力,要注意的是在使用這個函數(shù)時并不需要將this傳入第一個參數(shù)的位置,第一個參數(shù)僅僅是一個對函數(shù)內(nèi)this的一個TS描述,也就是說其實param才是實際使用時傳入的第一個參數(shù)。箭頭函是不需要描述其內(nèi)部的this的,因為TS會根據(jù)箭頭函數(shù)的聲明位置在上下文中確定其this 的類型。
????上面這個例子演示了如何定義函數(shù)類型的參數(shù),在不需要描述this的情況下我都喜歡使用箭頭函數(shù)的形式描述函數(shù)簽名,大多數(shù)情況在不需要復(fù)用的情況下推薦使用上例中func函數(shù)的聲明形式。