TypeScript中的泛型

2021-10-01 14:01:58 字數 1241 閱讀 8224

很多時候我們希望乙個函式或者乙個類可以支援多種資料型別,有很大的靈活性。

很多小夥伴可能會想到函式過載,聯合型別,或者any型別等。

函式過載**量大,聯合型別冗長。

function log(value:any):any
雖然使用any型別可以滿足我們的需求,但是缺失型別資訊,這不是我們所希望的,這裡我們就可以使用泛型。

不預先確定的函式型別,具體的型別在使用的時候才能確定

// 泛型函式

function logs(value:t):t

// 型別t不需要預先指定,相當於any型別 ;保證了輸入引數和返回值是一致的

泛型函式有兩種呼叫方式:

指明引數型別:logs(['a','b']);

利用ts的型別推斷,省略引數型別:logs(['c','d'])

我們不僅可以用泛型來定義乙個函式,也可以定義乙個函式型別

type log=(value:t)=>t;

let mylog:log=log;

// 這裡僅僅使用泛型來約束了乙個函式

inte***ce l

// 使用泛型來約束介面的其他成員,當泛型約束整個介面的時候,實現時我們必須指定乙個型別

inte***ce lj

泛型可以理解為代表函式型別的引數。

//泛型約束類成員

class logs

}let log1=new logs(); //顯示傳入t的型別

log1.run(1);

let log2=new logs(); //當不指定型別引數的時候,value的值就可以是任意的型別

log2.run('lll')

// 泛型不能應用於類的靜態成員

class logs

}

function lg(value:t):t

inte***ce len

function l(value:t):t

l([1,2]); // 引數受到泛型的約束,必須具有length屬性

l(1); //型別「1」的引數不能賦給型別「len」的引數。

泛型的好處:

函式和類可以輕鬆的支援多種型別,增強程式的擴充套件性

不必寫多條函式過載,冗長的聯合型別宣告,增強**的可讀性

靈活控制型別之間的約束

TypeScript中泛型的使用

對於typescript中的泛型,你可以把它理解為引數化型別,把每個引數的型別也封裝成引數的形式,而這個封裝的方式,就是泛型。如果我們要編寫乙個函式,接收兩個引數,這兩個引數可能都為string型別或者都為number型別,最後做拼接操作。對於這個功能,其實通過上面的聯合型別以及型別保護就能實現,但...

TypeScript泛型約束

有了泛型之後,乙個函式或容器類能處理的型別一下子擴到了無限大,似乎有點失控的感覺。所以這裡又產生了乙個約束的概念。我們可以宣告對型別引數進行約束。我們還拿上文中的student栗子來說,想訪問value的length屬性,但是編譯器並不能證明每種型別都有length屬性,所以就報錯了。student...

TypeScript泛型介面

以使用介面的方式來定義乙個函式需要符合的形狀 inte ce searchfunc let mysearch searchfunc source string,substring string 當然也可以使用含有泛型的介面來定義函式的形狀 inte ce createarrayfunc let cr...