五、泛型使用

官網文檔地址 https://www.typescriptlang.org/docs/handbook/generics.html

泛型

軟件工程的一個主要部分是構建組件,這些組件不僅具有定義良好和一致的API,而且還具有可重用性。能夠處理今天的數據和明天的數據的組件將爲您提供構建大型軟件系統的最靈活的能力。

在C#和Java等語言中,工具箱中用於創建可重用組件的主要工具之一是泛型也就是說,能夠創建一個可以工作於多種類型而不是單個類型的組件。這允許用戶使用這些組件並使用自己的類型。

通俗理解:泛型就是解決類、接口、方法的複用性、以及對不特定數據類型的支持

使用any類型可以實現複用,但是這樣就放棄了類型檢查的功能。

泛型函數
泛型類型在<>中指定,一般爲類型變量T

function identity<T>(arg: T): T {
    return arg;
}
添加了一個類型變量T身份函數,這T允許我們捕獲用戶提供的類型(例如:number),以便以後可以使用該信息。在這裏,我們用T再次作爲返回類型。在檢查時,我們現在可以看到參數和返回類型使用相同的類型。這允許我們在函數的一邊輸入信息,然後將信息輸出到函數的另一端。
=====
function identity<T>(arg: T): T {
    return arg;
}

let myIdentity: <T>(arg: T) => T = identity;
console.log(myIdentity<string>('2str'))
=====
function getData<T>(num:T):T{
    return num;
}
console.log(getData<number>(2));// 具體類型調用時決定
=====

泛型類

泛型T,由實例化時指定的泛型確定

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; };

類的類型有兩個方面:靜態側和實例端。泛型類只是實例端的泛型,而不是靜態端的泛型,因此在使用類時,靜態成員不能使用類的類型參數

創建一個描述約束的接口。在這裏,我們將創建一個有一個.length屬性,然後我們將使用此接口和extends關鍵字來表示我們的約束
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;
}

把類作爲參數類型來約束泛型類
//把類作爲參數來約束數據傳入的類型
class User{
	username!:string;
	password!:string;
}
class db<T>{
	add(user:T):void{
		console.log(user);
	}
}
let user = new User();
user.username="xiaoxi";
user.password="123"
let dbObj = new db<User>();
dbObj.add(user);

泛型接口
interface ConfigFN{
	<T>(value:T):T;
}
let getDate:ConfigFn = function<T>(value:T):T{
	return value;
}
console.log(getDate<string>('123'));
=====
interface GenericIdentityFn<T> {
    (arg: T): T;
}

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

let myIdentity: GenericIdentityFn<string> = identity;

console.log(myIdentity('xiaoxi'))

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章