TypeScript 泛型限定
泛型比較靈活,可以傳遞多種資料型別,當然也可以對這個傳遞的型別進行限定。
首先看一段程式碼例項:
[typescript] 純文字檢視 複製程式碼function identity<T>(arg: T): T { console.log(arg.length); return arg; }
上面的程式碼會報錯,泛型可以傳遞多種型別,不一定具有length屬性。
我們可以進行一下限定來解決此問題,也就是要求傳遞的型別必須具有length屬性。
程式碼例項如下:
[typescript] 純文字檢視 複製程式碼interface Lengthwise { length: number; } function identity<T extends Lengthwise>(arg: T): T { console.log(arg.length); return arg; } identity(5)//5是number型別,不具有length屬性 identity("螞蟻部落")//字串具有length屬性
使用extends對泛型新增約束,所以函式傳遞的引數也是有限制的,必須具有length屬性。
[typescript] 純文字檢視 複製程式碼function getProperty<T, K extends keyof T>(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'.
可以宣告一個型別引數,且它被另一個型別引數所約束。
比如,現在想要用屬性名從物件裡獲取這個屬性,要確保這個屬性存在於物件obj上,因此需要在這兩個型別之間使用約束。在TypeScript使用泛型建立工廠函式時,需要引用建構函式的類型別。
程式碼例項如下:
[typescript] 純文字檢視 複製程式碼function create<T>(c: {new(): T; }): T { return new c(); }
再來看一段程式碼例項:
[typescript] 純文字檢視 複製程式碼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!
使用原型屬性推斷並約束建構函式與類例項的關係。
相關文章
- TypeScript 泛型型別TypeScript泛型型別
- TypeScript 泛型介面和泛型類TypeScript泛型
- TypeScript 泛型相容TypeScript泛型
- TypeScript 工具泛型TypeScript泛型
- TypeScript基礎--泛型TypeScript泛型
- TypeScript 基本型別和泛型的使用TypeScript型別泛型
- TypeScript學習(四)—— 介面和泛型TypeScript泛型
- 為vue3學點typescript, 泛型VueTypeScript泛型
- 重拾TypeScript-21 類中使用泛型TypeScript泛型
- TypeScript 官方手冊翻譯計劃【六】:型別操控-泛型TypeScript型別泛型
- TypeScript 2.1中的型別運算 & 一個遞迴的Readonly泛型TypeScript型別遞迴泛型
- 泛型類、泛型方法及泛型應用泛型
- 【java】【泛型】泛型geneticJava泛型
- 泛型類和泛型方法泛型
- 泛型--泛型萬用字元和泛型的上下限泛型字元
- Go 泛型之泛型約束Go泛型
- ts 終於搞懂TS中的泛型啦! | typescript 入門指南 04泛型TypeScript
- 你不知道的 TypeScript 泛型(萬字長文,建議收藏)TypeScript泛型
- 泛型泛型
- 泛型最佳實踐:Go泛型設計者教你如何用泛型泛型Go
- TypeScript學習筆記(三)泛型、模組化和名稱空間TypeScript筆記泛型
- 型別 VS 泛型型別泛型
- 泛型類、泛型方法、型別萬用字元的使用泛型型別字元
- 泛型(一)泛型
- 泛型(三)泛型
- 泛型(二)泛型
- 泛型(四)泛型
- 泛型(五)泛型
- Java泛型Java泛型
- 泛型viewmodle泛型View
- 泛型(Generic)泛型
- Go 泛型Go泛型
- PHP 用 Enum 限定引數型別PHP型別
- TypeScript this型別TypeScript型別
- 【譯】在非泛型類中建立泛型方法泛型
- 泛型型別(.NET 指南)泛型型別
- Java函式泛型List引數,操作泛型元素Java函式泛型
- Go 官方出品泛型教程:如何開始使用泛型Go泛型