TypeScript-generics

前言

泛型是為了構建通用化的組件所設計的,在強類型語言中,泛型是構建大型復雜系統(tǒng)的主要特性之一穿香,它允許將類型定義通用化亭引,而不是單一的形式。

一皮获、基本使用

function doSomeThing<T>(arg: T): T {
  return arg;
}

相比于我們之前學習的類型定義的方式焙蚓,這里我們多了一個<T>,在TypeScript中,這就叫泛型,表示的語義為,當你調用這個函數(shù)的時候除了傳遞常用的參數(shù)主届,你也可以傳遞類型赵哲,內部會使用傳遞的這個類型。

比如君丁,我們傳遞一個string類型:

doSomeThing<string>("mss")

值得注意的是,當你使用了泛型,TypeScript會默認會通過外部傳入的類型将宪,推斷內部變量或者函數(shù)的返回值的類型绘闷,并且強制內部的類型要符合外部傳入的類型,否則较坛,TypeScript會報錯:

function doSomeThing<T>(arg: T): T {
  console.log(arg.length)
  return arg;
}

// Property 'length' does not exist on type 'T'

但是我們有的數(shù)據(jù)類型就是存在length屬性的印蔗,那我們這時應該怎么做呢?比如數(shù)組來說丑勤,TypeScript允許我們直接定義數(shù)組的泛型:

function deArr<T>(arg: T[]): T[] {
  console.log(arg.length);
  return arg;
}

此時我們訪問length就是合法的华嘹。

同時,定義數(shù)組的泛型也可以這樣寫法竞,這種方式和上面那種方式是等效的:

function deAnotherArr<T>(arg: Array<T>): Array<T> {
  console.log(arg.length);
  return arg
}

這種方式也是可以耙厚,完全取決于你個人的喜好。

二岔霸、使用泛型類型

基本使用

function doSomeThing<T>(arg: T): T {
  console.log(arg.length)
  return arg;
}

let myDoSomeThing: <T>(arg: T) => T = doSomeThing;

傳入的類型參數(shù)薛躬,也可以不用和函數(shù)定義的T保持一致:

let myDoSomeThing: <U>(arg: U) => U = doSomeThing;

這樣也是可以的。

三呆细、泛型接口

基本使用:

我們首先定義一個泛型接口:

interface GenericInterFace {
  <T>(arg: T): T
}

然后我們這樣使用:

let genericInterFace: GenericInterFace = function get<T>(arg: T):T {
  return arg;
}

也可以在定義接口的時候將傳入泛型的類型:

interface GenericInterFace<T> {
  (arg: T): T
}

使用的方式和上面的例子一樣:

let genericInterFace: GenericInterFace = function get<T>(arg: T):T {
  return arg;
}

此外型宝,前面的例子里面,當我們使用泛型的時候絮爷,由于TypeScript編譯器不能推斷傳入的T的類型趴酣,當然這也不可能推斷,所以當我們試圖在內部訪問length屬性的時候坑夯,就會報錯岖寞。然后,我們這里可以利用接口渊涝,在編譯之前就給開發(fā)一個友好的提示:

定義一個length的接口:

interface Lengthwise {
  length: number;
}

然后重寫我們前面的doSomeThing例子:

function doSomeThing<T extends Lengthwise>(arg: T): T {
  console.log(arg.length)
  return arg;
}

此時就不會報錯慎璧,這里已經(jīng)確保了傳入的參數(shù)必定是有length屬性的。

四跨释、泛型類

泛型類在結構上和泛型接口差不多胸私。

class GenericClass<T> {
  name: T
  add: (x: T, y:T) => T
}

然后我們可以正常的通過new關鍵字進行實例化。

let genericClass = new GenericClass();
genericClass.name = 'mss';

當然鳖谈,使用泛型的一個好處就是你可以傳入任意類型的類型參數(shù):

let genericClass = new GenericClass<string>();

這也是合理的岁疼。

五、泛型的高級用法

1、使用泛型確保訪問對象時不會訪問到對象不存在的屬性捷绒。

定義一個泛型

function getProperty<T, K extends keyof T>(obj: T, key: K) {
  return obj[key];
}

注意這里是的keyof是TypeScript中給我們提供的遍歷對象屬性值的操作符瑰排。

然后我們這樣使用:

let x = { a: 1, b: 2, c: 3, d: 4 };

getProperty(x, "a");
// 1

getProperty(x, "m");
// Argument of type '"m"' is not assignable to parameter of type '"a" | "b" | "c" | "d"'.

2、類的構造函數(shù)和泛型一起使用

function create<T>(c: { new (): T }): T {
  return new c();
}
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末暖侨,一起剝皮案震驚了整個濱河市椭住,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌字逗,老刑警劉巖京郑,帶你破解...
    沈念sama閱讀 211,639評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異葫掉,居然都是意外死亡些举,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評論 3 385
  • 文/潘曉璐 我一進店門俭厚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來户魏,“玉大人,你說我怎么就攤上這事挪挤〉鸪螅” “怎么了?”我有些...
    開封第一講書人閱讀 157,221評論 0 348
  • 文/不壞的土叔 我叫張陵电禀,是天一觀的道長幢码。 經(jīng)常有香客問我,道長尖飞,這世上最難降的妖魔是什么症副? 我笑而不...
    開封第一講書人閱讀 56,474評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮政基,結果婚禮上贞铣,老公的妹妹穿的比我還像新娘。我一直安慰自己沮明,他們只是感情好辕坝,可當我...
    茶點故事閱讀 65,570評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著荐健,像睡著了一般酱畅。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上江场,一...
    開封第一講書人閱讀 49,816評論 1 290
  • 那天纺酸,我揣著相機與錄音,去河邊找鬼址否。 笑死餐蔬,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播樊诺,決...
    沈念sama閱讀 38,957評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼仗考,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了词爬?” 一聲冷哼從身側響起秃嗜,我...
    開封第一講書人閱讀 37,718評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎顿膨,沒想到半個月后痪寻,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,176評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡虽惭,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,511評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了蛇尚。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片芽唇。...
    茶點故事閱讀 38,646評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖取劫,靈堂內的尸體忽然破棺而出匆笤,到底是詐尸還是另有隱情,我是刑警寧澤谱邪,帶...
    沈念sama閱讀 34,322評論 4 330
  • 正文 年R本政府宣布炮捧,位于F島的核電站,受9級特大地震影響惦银,放射性物質發(fā)生泄漏咆课。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,934評論 3 313
  • 文/蒙蒙 一扯俱、第九天 我趴在偏房一處隱蔽的房頂上張望书蚪。 院中可真熱鬧,春花似錦迅栅、人聲如沸殊校。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽为流。三九已至,卻和暖如春让簿,著一層夾襖步出監(jiān)牢的瞬間敬察,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評論 1 266
  • 我被黑心中介騙來泰國打工拜英, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留静汤,地道東北人。 一個月前我還...
    沈念sama閱讀 46,358評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像虫给,于是被迫代替她去往敵國和親藤抡。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,514評論 2 348

推薦閱讀更多精彩內容