天天看點

TypeScript-泛型

typescript泛型

軟體工程中,我們不僅要建立一緻的定義良好的api,同時也要考慮可重用性。 元件不僅能夠支援目前的資料類型,同時也能支援未來的資料類型,這在建立大型系統時為你提供了十分靈活的功能。 使用泛型來建立可重用的元件,一個元件可以支援多種類型的資料。 這樣使用者就可以以自己的資料類型來使用元件。

平時我們是對 **值 **進行程式設計,泛型是對 類型 進行程式設計,用來限定值和對值的操作。

不可拓展!

使用聯合類型或函數重載,過于麻煩。

如果換成any類型,就沒有意義。失去了定義傳回類型的能力,也失去了類型保護的能力。

TypeScript-泛型

typescript是靜态分析工具,不應該依賴js運作時。

這種可以适用于多種類型的函數此時叫做泛型。不同于any, 不會丢失資訊,可以保持準确性。

特點:

函數名後添加了代表類型變量的**t。**它隻代表類型,并不代表具體的值。

t可以用任何有效名稱代替,常見的

k(key)表示對象中的鍵類型

v(value)表示對象中的值類型

e(element)表示元素類型

可以同時添加多個類型變量

與函數泛型類似,在類名後面增加<t, ...>的文法定義。

形如 { new (): t } 是一個構造簽名, 此時指定傳入的type是可被構造的,執行個體化後的類型是泛型t。

泛型不适用于類的靜态屬性。類的靜态屬性和靜态方法不能被執行個體化,隻能通過調用類來使用。

限制每個類型變量接受的類型,這就是泛型限制的作用。

希望類型變量對應的類型上存在某些屬性

可以逗号分隔多種限制類型

keyof操作符,用于擷取某種類型的所有鍵,傳回類型是聯合類型

www.tslang.cn/docs/handbo…

利用keyof,限制輸入的屬性名必須包含在keyof傳回的聯合類型中

這樣的方案保證了參數key一定是對象中所含有的鍵,不會發生運作時錯誤。是一種類型安全的解決方案。

當使用泛型時沒有在代碼中直接指定類型參數,從實際值參數中也無法推斷出類型時,這個預設類型就會起作用。

有預設類型的類型參數被認為是可選的

必選的類型參數不能在可選的類型參數後

如果類型參數有限制,類型參數的預設類型必須滿足這個限制

當制定類型實參時,隻需要指定必選類型參數的類型實參。未指定的類型參數會被解析為他們的預設類型

如果指定了預設類型,且類型推斷無法選擇一個候選類型,那麼将使用預設類型作為推斷結果

一個被現有類或接口合并的類或接口的聲明可以為現有類型參數引入預設類型

一個被現有類或接口合并的類或接口的聲明可以引入新的類型參數,隻要它指定了預設類型

條件類型會以一個表達式進行類型關系檢測,進而在兩種類型中選擇其一。使用infer關鍵字實作類型抽取。

infer表示extends中待推定的類型變量

在 promise對象中的使用

typescript内置了一些工具泛型,靈活使用可以使我們的ts更加強大。github.com/microsoft/t…

作用是将某個類型裡的屬性全部變為可選項。

keyof 可以用來取得一個對象接口的所有 key 值;  in 則可以周遊枚舉類型

舉個例子:git.dian.so/powergreen/…

作用是将某個類型裡的屬性全部變為必選項。

-? 将可選項代表的?去掉

作用是将某個類型裡的屬性全部變為隻讀。

作用是将某個類型裡的屬性都轉為t類型

作用是将某個類型裡的k取出來,并生成一個新的類型

作用是将某個類型中屬于另一個類型移除掉/提取出。

作用是用來忽略 t 中的 k 屬性

去除 t 中包含的 null 或者 undefined

擷取一個函數的參數類型,而且傳回的是隻能包含一組類型的數組

得到一個函數的傳回值類型

擷取一個類的構造函數參數類型,并以數組的形式傳回

擷取一個類的執行個體類型

繼續閱讀