TS 函數(shù)重載

函數(shù)重載

這個概念是在一些強類型語言中才有的,在JS中依據(jù)不同參數(shù)類型或參數(shù)個數(shù)執(zhí)行一些不同函數(shù)體的實現(xiàn)很常見作岖,依托于TypeScript唆垃,就會有需要用到這種聲明的地方。

關(guān)于函數(shù)重載痘儡,必須要把精確的定義放在前面辕万,最后函數(shù)實現(xiàn)時,需要使用 |操作符或者?操作符沉删,把所有可能的輸入類型全部包含進去渐尿,以具體實現(xiàn)。如下例子1 和 例子3

例子1
例如我們有一個add函數(shù)矾瑰,它可以接收string類型的參數(shù)進行拼接,也可以接收number類型的參數(shù)進行相加殴穴。

// 上邊是聲明
function add (arg1: string, arg2: string): string
function add (arg1: number, arg2: number): number
// 因為我們在下邊有具體函數(shù)的實現(xiàn)凉夯,所以這里并不需要添加 declare 關(guān)鍵字

// 下邊是實現(xiàn)
function add (arg1: string | number, arg2: string | number) {
  // 在實現(xiàn)上我們要注意嚴格判斷兩個參數(shù)的類型是否相等货葬,而不能簡單的寫一個 arg1 + arg2
  if (typeof arg1 === 'string' && typeof arg2 === 'string') {
    return arg1 + arg2
  } else if (typeof arg1 === 'number' && typeof arg2 === 'number') {
    return arg1 + arg2
  }
}

TypeScript 中的函數(shù)重載也只是多個函數(shù)的聲明,具體的邏輯還需要自己去寫人柿,他并不會真的將你的多個重名 function 的函數(shù)體進行合并

考慮如下 例子2

interface User {
  name: string;
  age: number;
}

declare function test(para: User | number, flag?: boolean): number;

在這個 test 函數(shù)里隘截,我們的本意可能是當傳入?yún)?shù) para 是 User 時犀农,不傳 flag,當傳入 para 是 number 時击你,傳入 flag。TypeScript 并不知道這些鸵钝,當你傳入 para 為 User 時怠堪,flag 同樣允許你傳入:

const user = {
  name: 'Jack',
  age: 666
}

// 沒有報錯福压,但是與想法違背
const res = test(user, false);

使用函數(shù)重載能幫助我們實現(xiàn):

interface User {
  name: string;
  age: number;
}

declare function test(para: User): number;
declare function test(para: number, flag: boolean): number;

const user = {
  name: 'Jack',
  age: 666
};

// bingo
// Error: 參數(shù)不匹配
const res = test(user, false);

實際項目中掏秩,你可能要多寫幾步,如在 class 中:

interface User {
  name: string;
  age: number;
}

const user = {
  name: 'Jack',
  age: 123
};

class SomeClass {

  /**
   * 注釋 1
   */
  public test(para: User): number;
  /**
   * 注釋 2
   */
  public test(para: number, flag: boolean): number;
  public test(para: User | number, flag?: boolean): number {
    // 具體實現(xiàn)
    return 11;
  }
}

const someClass = new SomeClass();


// ok
someClass.test(user);
someClass.test(123, false);

// Error
someClass.test(123);
someClass.test(user, false);

一些不需要函數(shù)重載的場景(并不絕對荆姆,如上例子2)

函數(shù)重載的意義在于能夠讓你知道傳入不同的參數(shù)得到不同的結(jié)果蒙幻,如果傳入的參數(shù)不同,但是得到的結(jié)果(類型)卻相同胆筒,那么這里就不要使用函數(shù)重載(沒有意義)邮破。
如果函數(shù)的返回值類型相同,那么就不需要使用函數(shù)重載

function func (a: number): number
function func (a: number, b: number): number

// 像這樣的是參數(shù)個數(shù)的區(qū)別仆救,我們可以使用可選參數(shù)來代替函數(shù)重載的定義

function func (a: number, b?: number): number

// 注意第二個參數(shù)在類型前邊多了一個`?`

// 亦或是一些參數(shù)類型的區(qū)別導致的
function func (a: number): number
function func (a: string): number

// 這時我們應(yīng)該使用聯(lián)合類型來代替函數(shù)重載
function func (a: number | string): number

參考資料

如何編寫 Typescript 聲明文件
巧用 TypeScript (一)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末抒和,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子派桩,更是在濱河造成了極大的恐慌构诚,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,599評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件铆惑,死亡現(xiàn)場離奇詭異,居然都是意外死亡送膳,警方通過查閱死者的電腦和手機员魏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,629評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來叠聋,“玉大人撕阎,你說我怎么就攤上這事÷挡梗” “怎么了虏束?”我有些...
    開封第一講書人閱讀 158,084評論 0 348
  • 文/不壞的土叔 我叫張陵棉饶,是天一觀的道長。 經(jīng)常有香客問我镇匀,道長照藻,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,708評論 1 284
  • 正文 為了忘掉前任汗侵,我火速辦了婚禮幸缕,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘晰韵。我一直安慰自己发乔,他們只是感情好,可當我...
    茶點故事閱讀 65,813評論 6 386
  • 文/花漫 我一把揭開白布雪猪。 她就那樣靜靜地躺著栏尚,像睡著了一般。 火紅的嫁衣襯著肌膚如雪只恨。 梳的紋絲不亂的頭發(fā)上抵栈,一...
    開封第一講書人閱讀 50,021評論 1 291
  • 那天,我揣著相機與錄音坤次,去河邊找鬼古劲。 笑死,一個胖子當著我的面吹牛缰猴,可吹牛的內(nèi)容都是我干的产艾。 我是一名探鬼主播,決...
    沈念sama閱讀 39,120評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼滑绒,長吁一口氣:“原來是場噩夢啊……” “哼闷堡!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起疑故,我...
    開封第一講書人閱讀 37,866評論 0 268
  • 序言:老撾萬榮一對情侶失蹤杠览,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后纵势,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體踱阿,經(jīng)...
    沈念sama閱讀 44,308評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,633評論 2 327
  • 正文 我和宋清朗相戀三年钦铁,在試婚紗的時候發(fā)現(xiàn)自己被綠了软舌。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,768評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡牛曹,死狀恐怖佛点,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤超营,帶...
    沈念sama閱讀 34,461評論 4 333
  • 正文 年R本政府宣布鸳玩,位于F島的核電站,受9級特大地震影響演闭,放射性物質(zhì)發(fā)生泄漏不跟。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,094評論 3 317
  • 文/蒙蒙 一船响、第九天 我趴在偏房一處隱蔽的房頂上張望躬拢。 院中可真熱鬧,春花似錦见间、人聲如沸聊闯。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,850評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽菱蔬。三九已至,卻和暖如春史侣,著一層夾襖步出監(jiān)牢的瞬間拴泌,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,082評論 1 267
  • 我被黑心中介騙來泰國打工惊橱, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蚪腐,地道東北人。 一個月前我還...
    沈念sama閱讀 46,571評論 2 362
  • 正文 我出身青樓税朴,卻偏偏與公主長得像回季,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子正林,可洞房花燭夜當晚...
    茶點故事閱讀 43,666評論 2 350

推薦閱讀更多精彩內(nèi)容