TypeScript函數(shù)詳解(五)

1.函數(shù)的類型

image.png
// 1.函數(shù)作為參數(shù)時, 在參數(shù)中如何編寫類型
function foo() {}

type FooFnType = () => void;
function bar(fn: FooFnType) {
  fn();
}

bar(foo);

// 2.定義常量時, 編寫函數(shù)的類型
type AddFnType = (num1: number, num2: number) => number;
const add: AddFnType = (a1: number, a2: number) => {
  return a1 + a2;
};

2 函數(shù)類型的案例

function calc(n1: number, n2: number, fn: (num1: number, num2: number) => number) {
  return fn(n1, n2)
}

const result1 = calc(20, 30, function(a1, a2) {
  return a1 + a2
})
console.log(result1)

const result2 = calc(20, 30, function(a1, a2) {
  return a1 * a2
})
console.log(result2)


3.函數(shù)的可選類型

image.png
// 可選類型是必須寫在必選類型的后面的
// y -> undefined | number
function foo(x: number, y?: number) {

}

foo(20, 30)
foo(20)

4.默認(rèn)參數(shù)

image.png
// 必傳參數(shù) - 有默認(rèn)值的參數(shù) - 可選參數(shù)
function foo(y: number, x: number = 20) {
  console.log(x, y)
}

foo(30)

function foo(x:number = 20, y:number) {
  console.log(x, y)
}

foo(undefined, 30)

5.剩余參數(shù)

從ES6開始翰守,JavaScript也支持剩余參數(shù)谅摄,剩余參數(shù)語法允許我們將一個不定數(shù)量的參數(shù)放到一個數(shù)組中冰寻。

// function sum(num1: number, num2: number) {
//   return num1 + num2
// }

function sum(initalNum: number, ...nums: number[]) {
  let total = initalNum
  for (const num of nums) {
    total += num
  }
  return total
}

console.log(sum(20, 30))
console.log(sum(20, 30, 40))
console.log(sum(20, 30, 40, 50))


6.可推導(dǎo)的this類型

// this是可以被推導(dǎo)出來 info對象(TypeScript推導(dǎo)出來)
//pTypeScript認(rèn)為函數(shù) eating 有一個對應(yīng)的this的外部對象 info揣钦,所以在使用時计贰,就會把this當(dāng)做該對象孔厉。
const info = {
  name: "why",
  eating() {
    console.log(this.name + " eating");
  },
};

info.eating(); //why eating

export {};

7.不確定的this類型

image.png
function eating() {
  console.log(this.name + " eating");
}

const info = {
  name: "why",
  eating: eating,
};

info.eating();
/* 
直接報錯
test.ts:2:15 - error TS2683: 'this' implicitly has type 'any' because it does not have a type annotation.
獨(dú)立函數(shù)推導(dǎo)不出來this
*/

8.指定this的類型

這個時候聂抢,通常TypeScript會要求我們明確的指定this的類型:

type ThisType = { name: string };

function eating(this: ThisType) {
  console.log(this.name + " eating");
}

const info = {
  name: "why",
  eating: eating,
};

// 隱式綁定
info.eating();//why eating

export {};

type ThisType = { name: string };

function eating(this: ThisType) {
  console.log(this.name + " eating");
}

const info = {
  name: "why",
  eating: eating,
};

// 隱式綁定
info.eating(); //why eating

//eating();
/* The 'this' context of type 'void' is not assignable to method's 'this' of type 'ThisType'.

直接eating的話是會報錯的凌外,因?yàn)闆]有指定this的類型,this似乎一個對象類型涛浙,里面有個string類型的name */
//可以通過以下方式
eating.call({ name: "kobe" });
eating.apply({ name: "james" });
/* 
kobe eating
james eating */
export {};

9.函數(shù)的重載(聯(lián)合類型)

image.png
 function sum(n1: string | number, n2: string | number): string | number {
  return n1 + n2;
}
/*
這么寫n1 + n2會報錯
因?yàn)閚1的類型是string | number
n2的類型是string | number
他們兩個類型之間是不能進(jìn)行相加的
 */

如何解決

/**
 * 通過聯(lián)合類型有兩個缺點(diǎn):
 *  1.進(jìn)行很多的邏輯判斷(類型縮小)
 *  2.返回值的類型依然是不能確定(any類型)
 */
function add(a1: number | string, a2: number | string) {
  if (typeof a1 === "number" && typeof a2 === "number") {
    return a1 + a2
  } else if (typeof a1 === "string" && typeof a2 === "string") {
    return a1 + a2
  }

  // return a1 + a2;
}

add(10, 20)

10. 函數(shù)的重載(函數(shù)重載)

比如我們對sum函數(shù)進(jìn)行重構(gòu):
在我們調(diào)用sum的時候康辑,它會根據(jù)我們傳入的參數(shù)類型來決定執(zhí)行函數(shù)體時,到底執(zhí)行哪一個函數(shù)的重載簽名轿亮;

// 函數(shù)的重載: 函數(shù)的名稱相同, 但是參數(shù)不同的幾個函數(shù), 就是函數(shù)的重載
function add(num1: number, num2: number): number; // 沒函數(shù)體
function add(num1: string, num2: string): string;

function add(num1: any, num2: any): any {
  if (typeof num1 === "string" && typeof num2 === "string") {
    return num1.length + num2.length;
  }
  return num1 + num2;
}

const result = add(20, 30); //從上往下一次匹配疮薇,于是就匹配到第一個add,但是第一個add沒有函數(shù)體我注,于是就執(zhí)行第三個add的函數(shù)體按咒,,也就是實(shí)現(xiàn)函數(shù)
const result2 = add("abc", "cba");
console.log(result);
console.log(result2);

// 在函數(shù)的重載中, 實(shí)現(xiàn)函數(shù)是不能直接被調(diào)用的但骨,只有在匹配之后励七,實(shí)現(xiàn)函數(shù)才能被調(diào)用
// add({name: "why"}, {age: 18})

export {};


11.聯(lián)合類型和函數(shù)重載對比

image.png

就是如果能通過聯(lián)合類型方便簡單的實(shí)現(xiàn)的情況下,盡量使用我們的聯(lián)合類型奔缠,因?yàn)楦唵温犹В驗(yàn)闊o論string和數(shù)組,都有l(wèi)ength屬性校哎,所以聯(lián)合類型可以實(shí)現(xiàn)两波,實(shí)現(xiàn)起來很簡潔瞳步,函數(shù)的重載反而有些麻煩。
如果通過聯(lián)合類型發(fā)現(xiàn)實(shí)現(xiàn)起來非常麻煩的情況下腰奋,我才會使用函數(shù)重載单起。

// 實(shí)現(xiàn)方式一: 聯(lián)合類型
function getLength(args: string | any[]) {
  return args.length
}

console.log(getLength("abc"))
console.log(getLength([123, 321, 123]))

// 實(shí)現(xiàn)方式二: 函數(shù)的重載
// function getLength(args: string): number;
// function getLength(args: any[]): number;

// function getLength(args: any): number {
//   return args.length
// }

// console.log(getLength("abc"))
// console.log(getLength([123, 321, 123]))
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市劣坊,隨后出現(xiàn)的幾起案子嘀倒,更是在濱河造成了極大的恐慌,老刑警劉巖局冰,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件测蘑,死亡現(xiàn)場離奇詭異,居然都是意外死亡锐想,警方通過查閱死者的電腦和手機(jī)帮寻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進(jìn)店門乍狐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來赠摇,“玉大人,你說我怎么就攤上這事浅蚪∨褐模” “怎么了?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵惜傲,是天一觀的道長洽故。 經(jīng)常有香客問我,道長盗誊,這世上最難降的妖魔是什么时甚? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮哈踱,結(jié)果婚禮上荒适,老公的妹妹穿的比我還像新娘。我一直安慰自己开镣,他們只是感情好刀诬,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著邪财,像睡著了一般陕壹。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上树埠,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天糠馆,我揣著相機(jī)與錄音,去河邊找鬼怎憋。 笑死榨惠,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播赠橙,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼耽装,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了期揪?” 一聲冷哼從身側(cè)響起掉奄,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎凤薛,沒想到半個月后姓建,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡缤苫,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年速兔,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片活玲。...
    茶點(diǎn)故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡涣狗,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出舒憾,到底是詐尸還是另有隱情镀钓,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布镀迂,位于F島的核電站丁溅,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏探遵。R本人自食惡果不足惜窟赏,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望箱季。 院中可真熱鬧涯穷,春花似錦、人聲如沸规哪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽诉稍。三九已至蝠嘉,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間杯巨,已是汗流浹背蚤告。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留服爷,地道東北人杜恰。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓获诈,卻偏偏與公主長得像,于是被迫代替她去往敵國和親心褐。 傳聞我的和親對象是個殘疾皇子舔涎,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評論 2 354

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