TypeScript泛型的使用(八)

1.認(rèn)識(shí)泛型

image.png

我們?yōu)榱俗屵@個(gè)sum函數(shù),他具備通用性吧享,我這里得寫一大堆的聯(lián)合類型


image.png

而且對(duì)于這一大堆的聯(lián)合類型來說甲葬,他們還有一些共性,還有哪些共性呢辉饱,比如說如果我們是一個(gè)number類型和這個(gè)string類型的話搬男,他們是可以相加的,如果是我們后面這兩種類型的話鞋囊,它是可以獲取的length的止后,但是當(dāng)我們把這些所有的這些類型寫到一起的時(shí)候在這里做一些操作的時(shí)候,其實(shí)我們就需要一個(gè)一個(gè)對(duì)他們來做判斷了溜腐,因?yàn)槲覀冞@里這個(gè)number一樣译株,你看我把鼠標(biāo)放上來的時(shí)候,這個(gè)NUMBER它就可能是四種類型里面的其中一個(gè)挺益,我哪知道你是什么類型歉糜,根本就不知道,你只能在這里慢慢給他做一些判斷了望众。

在我們定義一個(gè)函數(shù)的時(shí)候匪补,除了我們的這個(gè)參數(shù)的值可以讓外界在調(diào)用的時(shí)候動(dòng)態(tài)決定之外伞辛,我們的這個(gè)參數(shù)的類型也應(yīng)該是可以讓外界來決定的。js沒有類型夯缺,但是ts有類型限制蚤氏,一般寫一個(gè)固定的類型的,才會(huì)有類型限制踊兜。

解決方法要把我們的類型進(jìn)行參數(shù)化竿滨,什么叫做類型參數(shù)化呢,意思是我這里到底是一個(gè)什么類型捏境,不是我在定義函數(shù)的時(shí)候決定定義的于游,在我們定義這個(gè)函數(shù)時(shí),我不決定這些參數(shù)的類型垫言,而是讓調(diào)用者以參數(shù)的形式告知我這里的函數(shù)參數(shù)應(yīng)該是什么類型贰剥。

2.泛型實(shí)現(xiàn)類型參數(shù)化

image.png
// 類型的參數(shù)化

// 在定義這個(gè)函數(shù)時(shí), 我不決定這些參數(shù)的類型
// 而是讓調(diào)用者以參數(shù)的形式告知,我這里的函數(shù)參數(shù)應(yīng)該是什么類型
function sum<Type>(num: Type): Type {
  return num
}

// 1.調(diào)用方式一: 明確的傳入類型
sum<number>(20)
sum<{name: string}>({name: "why"})
sum<any[]>(["abc"])

// 2.調(diào)用方式二: 類型推到
sum(50)
sum("abc")

function foo<T, E, O>(arg1: T, arg2: E, arg3?: O, ...args: T[]) {

}

foo<number, string, boolean>(10, "abc", true)

3.泛型的基本補(bǔ)充

image.png

4.泛型接口

image.png
interface IPerson<T1, T2> {
  name: T1;
  age: T2;
}

const p: IPerson<string, number> = {
  name: "why",
  age: 18,
};

export {};

或者給IPerson一個(gè)默認(rèn)類型

interface IPerson<T1 = string, T2 = number> {
  name: T1;
  age: T2;
}

const p: IPerson = {
  name: "why",
  age: 18,
};

export {};

5.泛型類

image.png
class Point {
  x: number;
  y: number;
  z: number;

  constructor(x: number, y: number, z: number) {
    this.x = x;
    this.y = y;
    this.z = y;
  }
}

//const p1 = new Point("1.33.2", "2.22.3", "4.22.1")
//如果不想傳入number,而是字符串呢筷频?這時(shí)候不應(yīng)該把類的類型寫死
export {};

class Point<T> {
  x: T
  y: T
  z: T

  constructor(x: T, y: T, z: T) {
    this.x = x
    this.y = y
    this.z = y
  }
}

const p1 = new Point("1.33.2", "2.22.3", "4.22.1")
const p2 = new Point<string>("1.33.2", "2.22.3", "4.22.1")
const p3: Point<string> = new Point("1.33.2", "2.22.3", "4.22.1")

const names1: string[] = ["abc", "cba", "nba"]
const names2: Array<string> = ["abc", "cba", "nba"] // 不推薦(react jsx <>)

6.泛型的類型約束

image.png
// function getLength(arg: string | any[]) {
//   return arg.length;
// }
//使用聯(lián)合類型決定arg是什么類型蚌成,但是不是特別好,
//如果我們有個(gè)對(duì)象凛捏,里面有個(gè)lenth的屬性笑陈,
//其實(shí)也可以調(diào)用這個(gè)方法arg: string | any[] | {length : number},
//所以很難在這里把所有的類型窮舉完,
//這個(gè)時(shí)候就不要把類型寫死葵袭,使用泛型涵妥。
interface ILength {
  length: number;
}

function getLength<T extends ILength>(arg: T) {
  return arg.length;
}

getLength("abc");
getLength(["abc", "cba"]);
getLength({ length: 100 });
export {};

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市坡锡,隨后出現(xiàn)的幾起案子蓬网,更是在濱河造成了極大的恐慌,老刑警劉巖鹉勒,帶你破解...
    沈念sama閱讀 219,270評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件帆锋,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡禽额,警方通過查閱死者的電腦和手機(jī)锯厢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來脯倒,“玉大人实辑,你說我怎么就攤上這事≡宥” “怎么了剪撬?”我有些...
    開封第一講書人閱讀 165,630評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長悠反。 經(jīng)常有香客問我残黑,道長馍佑,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,906評(píng)論 1 295
  • 正文 為了忘掉前任梨水,我火速辦了婚禮拭荤,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘疫诽。我一直安慰自己穷劈,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,928評(píng)論 6 392
  • 文/花漫 我一把揭開白布踊沸。 她就那樣靜靜地躺著,像睡著了一般社证。 火紅的嫁衣襯著肌膚如雪逼龟。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,718評(píng)論 1 305
  • 那天追葡,我揣著相機(jī)與錄音腺律,去河邊找鬼。 笑死宜肉,一個(gè)胖子當(dāng)著我的面吹牛匀钧,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播谬返,決...
    沈念sama閱讀 40,442評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼之斯,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了遣铝?” 一聲冷哼從身側(cè)響起佑刷,我...
    開封第一講書人閱讀 39,345評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎酿炸,沒想到半個(gè)月后瘫絮,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,802評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡填硕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,984評(píng)論 3 337
  • 正文 我和宋清朗相戀三年麦萤,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片扁眯。...
    茶點(diǎn)故事閱讀 40,117評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡壮莹,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出姻檀,到底是詐尸還是另有隱情垛孔,我是刑警寧澤,帶...
    沈念sama閱讀 35,810評(píng)論 5 346
  • 正文 年R本政府宣布施敢,位于F島的核電站周荐,受9級(jí)特大地震影響狭莱,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜概作,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,462評(píng)論 3 331
  • 文/蒙蒙 一腋妙、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧讯榕,春花似錦骤素、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至霎槐,卻和暖如春送浊,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背丘跌。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評(píng)論 1 272
  • 我被黑心中介騙來泰國打工袭景, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人闭树。 一個(gè)月前我還...
    沈念sama閱讀 48,377評(píng)論 3 373
  • 正文 我出身青樓耸棒,卻偏偏與公主長得像,于是被迫代替她去往敵國和親报辱。 傳聞我的和親對(duì)象是個(gè)殘疾皇子与殃,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,060評(píng)論 2 355

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