TypeScript 泛型

介紹

???? 在軟件工程中碍遍,我們不僅要創(chuàng)建一致的定義良好的API奖磁,同時也要考慮可重用性改基,泛型,可以用來提高代碼的重用性。在代碼中秕狰,我們不僅需要支持當(dāng)前設(shè)計的數(shù)據(jù)類型稠腊,同時也要支持將來的數(shù)據(jù)類型,泛型鸣哀,提供了這種方便架忌。

泛型-初探

  • 不使用泛型
function identity(arg: number): number { return arg; }
// 或者
function identity(arg: any): any { return arg; }
  • 使用泛型定義
function identity<T>(arg: T): T { return ard; }
// 這樣我們使用的時候就很方便:
let outputStr: string = identity<string>('myString'); // 這里 `T` 明確了是 `string`類型 
let outputNum: number = identity<number>(123); // 這里 `T` 明確了是 `number`類型 
  • 方法中使用泛型的擴(kuò)展
function loggingIdentiry<T>(arg: Array<T>): Array<T>{ return arg; }

泛型接口

interface Resource<T>{
    limit: number;
    offset: number;
    size: number;
    items: Array<T>;
}
interface GenericIdentityFn<T>{
  (arg: T): T;
}

泛型類

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

泛型約束 extends

有時候我們需要確定某一類型一定具有某個屬性,可以通過extends實現(xiàn)

interface Lengthwise {
  length: number;
}
function loggingIndetity<T extends Lengthwise>(arg: T): T {
    console.log(arg.length); // 如果沒有`extends Lengthwise`的話我衬,這里使用length編譯的時候就會報錯
    return arg;
}
// 因為使用了約束叹放,所以arg已經(jīng)不是任意類型了,而是需要包含`length`屬性的任意類型
loggingIdentity(3); // Error挠羔,number doesn't have a .length property 就會報錯了井仰。
loggingIdentity({ length: 10, value: 3 }); // ? 這樣就是爭取的使用方式了

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

聲明一個類型參數(shù),且它被另一個類型參數(shù)所約束破加,如 想要屬性名從對象里獲取這個屬性俱恶,并且確保這個實行存在于對象obj上,因此需要在這兩個類型之間使用約束

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ù)時范舀,需要引用構(gòu)造函數(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!
createInstance(Bee).keeper.nametag; // error: Property 'nametag' does not exist on type 'BeeKeeper'.

【參考】https://www.tslang.cn/docs/handbook/generics.html

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市锭环,隨后出現(xiàn)的幾起案子聪全,更是在濱河造成了極大的恐慌,老刑警劉巖田藐,帶你破解...
    沈念sama閱讀 212,718評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件荔烧,死亡現(xiàn)場離奇詭異,居然都是意外死亡汽久,警方通過查閱死者的電腦和手機(jī)鹤竭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來景醇,“玉大人臀稚,你說我怎么就攤上這事∪担” “怎么了吧寺?”我有些...
    開封第一講書人閱讀 158,207評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長散劫。 經(jīng)常有香客問我稚机,道長,這世上最難降的妖魔是什么获搏? 我笑而不...
    開封第一講書人閱讀 56,755評論 1 284
  • 正文 為了忘掉前任赖条,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘纬乍。我一直安慰自己碱茁,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,862評論 6 386
  • 文/花漫 我一把揭開白布仿贬。 她就那樣靜靜地躺著纽竣,像睡著了一般。 火紅的嫁衣襯著肌膚如雪茧泪。 梳的紋絲不亂的頭發(fā)上蜓氨,一...
    開封第一講書人閱讀 50,050評論 1 291
  • 那天,我揣著相機(jī)與錄音调炬,去河邊找鬼语盈。 笑死舱馅,一個胖子當(dāng)著我的面吹牛缰泡,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播代嗤,決...
    沈念sama閱讀 39,136評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼棘钞,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了干毅?” 一聲冷哼從身側(cè)響起宜猜,我...
    開封第一講書人閱讀 37,882評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎硝逢,沒想到半個月后姨拥,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,330評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡渠鸽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,651評論 2 327
  • 正文 我和宋清朗相戀三年叫乌,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片徽缚。...
    茶點(diǎn)故事閱讀 38,789評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡憨奸,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出凿试,到底是詐尸還是另有隱情排宰,我是刑警寧澤,帶...
    沈念sama閱讀 34,477評論 4 333
  • 正文 年R本政府宣布那婉,位于F島的核電站板甘,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏详炬。R本人自食惡果不足惜盐类,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,135評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧傲醉,春花似錦蝇闭、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至吐咳,卻和暖如春逻悠,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背韭脊。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評論 1 267
  • 我被黑心中介騙來泰國打工童谒, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人沪羔。 一個月前我還...
    沈念sama閱讀 46,598評論 2 362
  • 正文 我出身青樓饥伊,卻偏偏與公主長得像,于是被迫代替她去往敵國和親蔫饰。 傳聞我的和親對象是個殘疾皇子琅豆,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,697評論 2 351

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

  • 軟件工程中,我們不僅要創(chuàng)建一致的定義良好的API篓吁,同時也要考慮可重用性茫因。 組件不僅能夠支持當(dāng)前的數(shù)據(jù)類型,同時也能...
    2o壹9閱讀 602評論 0 48
  • 泛型 軟件工程中杖剪,我們不僅要創(chuàng)建定義良好且一致的 API冻押,同時也要考慮可重用性。 組件不僅能夠支持當(dāng)前的數(shù)據(jù)類型盛嘿,...
    羅彬727閱讀 613評論 0 0
  • 泛型 泛型(Generics)是指在定義函數(shù)洛巢、接口或類的時候,不預(yù)先指定具體的類型孩擂,而在使用的時候再指定類型的一種...
    一瓣山河閱讀 379評論 0 1
  • 前言:泛型的英譯generics [d???n?r?ks] 泛型;狼渊;范型;通用類型类垦; 通用類型這四個字就是泛型的真...
    CondorHero閱讀 236評論 0 1
  • 泛型(Generics)是指在定義函數(shù)狈邑、接口或類的時候,不預(yù)先指定具體的類型蚤认,而在使用的時候再指定類型的一種特性泛...
    成熟穩(wěn)重的李先生閱讀 197評論 0 0