【TS】泛型 Generics
生活随笔
收集整理的這篇文章主要介紹了
【TS】泛型 Generics
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
泛型Generics,是指在定義函數Function、接口Interface 或類 Class 時不預先指定具體的類型,而是在使用的時候再指定類型的一種特征。
// 函數名后的 <> 內傳入泛型參數,在使用時指定類型 function echo<T>(arg: T): T {return arg }const str: string = 'str' const result = echo(str) //類型推論會推論出參數的類型泛型可以看作是類型變量,它是一種特殊的變量,只用于表示類型而不是值。在使用時把類型像參數一樣傳入。
function swap<T, U>(tuple: [T, U]): [U, T] {return [tuple[1], tuple[0]] }const result2 = swap(['string', 123]) results[1].fixed() // 可以調用Number方法約束泛型-函數(在函數的參數和返回值中使用泛型)
有時候想操作某類型的一組值,并且我們知道這組值具有什么樣的屬性。?在 下面例子中,我們想訪問arg的length屬性,但是編譯器并不能證明每種類型都有length屬性,所以就報錯了。
function loggingIdentity<T>(arg: T): T {console.log(arg.length); // Error: T doesn't have .lengthreturn arg; }相比于操作any所有類型,我們想要限制函數去處理任意帶有.length屬性的所有類型。 只要傳入的類型有這個屬性,我們就允許,就是說至少包含這一屬性。 為此,我們需要列出對于T的約束要求。
為此,我們定義一個接口來描述約束條件。 創建一個包含?.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 errorreturn arg; }// 現在這個泛型函數被定義了約束,因此它不再是適用于任意類型: loggingIdentity(3); // Error, number doesn't have a .length property// 我們需要傳入符合約束類型的值,必須包含必須的屬性: loggingIdentity({length: 10, value: 3}); loggingIdentity([1, 2, 3]); loggingIdentity('string');約束泛型-類 Class
// 隊列類-先進先出 class Queue {private data = []push(item) {return this.data.push(item)}pop() {return this.data.shift()} }// 實例化類 const queue = new Queue() queue.push(1) queue.push('str') console.log(queue.pup().toFixed()) // 1 // string 類型并無toFixed 方法 console.log(queue.pop().toFixed()) // Error:...toFixed is not a function/*-- 解決以上問題需要為該類添加泛型約束 --*/ class Queue<T> {private data = []push(item: T) {return this.data.push(item)}pop(): T {return this.data.shift()} }// 實例化類-添加實例類型 number const queue = new Queue<number>() queue.push(1) // queue.push('str') // 已不符合約定的類型 console.log(queue.pop().toFixed()) // 1 // string 類型并無toFixed 方法 console.log(queue.pop().toFixed()) // Error:...toFixed is not a function// 實例化類-添加實例類型 string const queue = new Queue<string>() queue.push(1) console.log(queue.pop().length) // 1約束泛型- Interface
interface KeyPair<T, U> {key: T;value: U; } let kp1: KeyPair<number, string> = { key: 123, value: 'str'} let kp2: KeyPair<string, number> = { key: 'str', value: 123}let arr: number[] = [1, 2, 3] let arrTwo: Array<number> = [1, 2, 3]在interface 函數中使用泛型
interface IPlus<T> {(a: T, b: T): T } function plus(a: number, b: number): number {return a + b } function connect(a: string, b: string): string {return a + b } const a: IPlus<number> = plus() const b: IPlus<string> = connect()總結
以上是生活随笔為你收集整理的【TS】泛型 Generics的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 潜艇大作战
- 下一篇: 名帖04 李阳冰 篆书《城隍庙碑》