TS筆記之 泛型

泛型

介紹

軟件工程中察藐,我們不僅要創(chuàng)建一致的定義良好的 API,同時也要考慮可重用性转培。 組件不僅能夠支持當前的數(shù)據(jù)類型浆竭,同時也能支持未來的數(shù)據(jù)類型,這在創(chuàng)建大型系統(tǒng)時為你提供了十分靈活的功能删窒。可以使用泛型來創(chuàng)建可重用的組件肌索,一個組件可以支持多種類型的數(shù)據(jù)特碳。

泛型之 Hello World

這個函數(shù)會返回任何傳入它的值

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

\color{#bf414a}{泛型} 有兩種方法使用:

1.傳入所有的參數(shù),包含類型參數(shù):

let output = identity<string>("myString"); // type of output will be 'string'

2.類型推論 -- 編譯器會根據(jù)傳入的參數(shù)自動地幫助我們確定 T 的類型

let output = identity("myString"); // type of output will be 'string'

使用泛型變量

把泛型變量 T 當做類型的一部分使用站宗,而不是整個類型益愈,增加了靈活性

function loggingIdentity<T>(arg: Array<T>): Array<T> {
  console.log(arg.length); // Array has a .length, so no more error
  return arg;
}

泛型類型

泛型接口:

interface GenericIdentityFn<T> {
  (arg: T): T;
}

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

let myIdentity: GenericIdentityFn<number> = identity;

除了泛型接口,我們還可以創(chuàng)建泛型類敏释。 注意摸袁,無法創(chuàng)建泛型枚舉和泛型命名空間。

泛型類

泛型類看上去與泛型接口差不多靠汁。 泛型類使用( <>)括起泛型類型湿蛔,跟在類名后面阳啥。

class GenericNumber<T> {
  zeroValue: T;
  add: (x: T, y: T) => T;
}

let myGenericNumber = new GenericNumber<number>();
myGenericNumber.zeroValue = 0;
myGenericNumber.add = function (x, y) {
  return x + y;
};

泛型類指的是實例部分的類型财喳,所以類的靜態(tài)屬性不能使用這個泛型類型。

泛型約束

我們想要限制函數(shù)去處理任意帶有.length 屬性的所有類型耳高。 只要傳入的類型有這個屬性,我們就允許概荷,就是說至少包含這一屬性。 為此误证,我們需要列出對于 T 的約束要求修壕。

為此,我們定義一個接口來描述約束條件慈鸠。 創(chuàng)建一個包含 .length 屬性的接口,使用這個接口和 extends 關鍵字來實現(xiàn)約束:

interface Lengthwise {
  length: number;
}

function loggingIdentity<T extends Lengthwise>(arg: T): T {
  console.log(arg.length); // Now we know it has a .length property, so no more error
  return arg;
}

現(xiàn)在這個泛型函數(shù)被定義了約束譬巫,因此它不再是適用于任意類型:

loggingIdentity(3); // Error, number doesn't have a .length property

在泛型約束中使用類型參數(shù)

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

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

getProperty(x, "a"); // okay
getProperty(x, "m"); // error: Argument of type 'm' isn't assignable to 'a' | 'b' | 'c' | 'd'.

在泛型里使用類類型

在 TypeScript 使用泛型創(chuàng)建工廠函數(shù)時督笆,需要引用構造函數(shù)的類類型

function create<T>(c: { new (): T }): T {
  return new c();
}

一個更高級的例子,使用原型屬性推斷并約束構造函數(shù)與類實例的關系。

class BeeKeeper {
  hasMask: boolean;
}

class ZooKeeper {
  nametag: string;
}

class Animal {
  numLegs: number;
}

class Bee extends Animal {
  keeper: BeeKeeper;
}

class Lion extends Animal {
  keeper: ZooKeeper;
}

function createInstance<A extends Animal>(c: new () => A): A {
  return new c();
}

createInstance(Lion).keeper.nametag; // typechecks!
createInstance(Bee).keeper.hasMask; // typechecks!
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末咸作,一起剝皮案震驚了整個濱河市宵睦,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌壳嚎,老刑警劉巖末早,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件然磷,死亡現(xiàn)場離奇詭異刊驴,居然都是意外死亡,警方通過查閱死者的電腦和手機捆憎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來致份,“玉大人础拨,你說我怎么就攤上這事√粒” “怎么了?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵锰提,是天一觀的道長芳悲。 經常有香客問我,道長名扛,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任融蹂,我火速辦了婚禮弄企,結果婚禮上,老公的妹妹穿的比我還像新娘拘领。我一直安慰自己,他們只是感情好届良,可當我...
    茶點故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著士葫,像睡著了一般。 火紅的嫁衣襯著肌膚如雪为障。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天呻右,我揣著相機與錄音鞋喇,去河邊找鬼。 笑死侦香,一個胖子當著我的面吹牛,可吹牛的內容都是我干的罐韩。 我是一名探鬼主播,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼龙考,長吁一口氣:“原來是場噩夢啊……” “哼矾睦!你這毒婦竟也來了?” 一聲冷哼從身側響起枚冗,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎坛怪,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體袜匿,經...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡毁涉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年贫堰,在試婚紗的時候發(fā)現(xiàn)自己被綠了穆壕。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片其屏。...
    茶點故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖偎行,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情蛤袒,我是刑警寧澤,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布缴允,位于F島的核電站珍德,受9級特大地震影響,放射性物質發(fā)生泄漏锈候。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一泵琳、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧虑稼,春花似錦、人聲如沸蛛倦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽且改。三九已至,卻和暖如春又跛,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工端幼, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人婆跑。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓庭呜,卻偏偏與公主長得像,于是被迫代替她去往敵國和親募谎。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,611評論 2 353

推薦閱讀更多精彩內容