您好,登錄后才能下訂單哦!
這篇文章主要為大家展示了“TypeScript 泛型怎么用”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“TypeScript 泛型怎么用”這篇文章吧。
現在我們要定義一個join
函數,該函數的功能主要是接受兩個類型一樣的值,返回兩個參數拼接后的值。示例代碼如下:
// 所謂的泛型,通俗一點的解釋就是泛指的類型 // 定義一個join函數,接受兩個一樣類型的參數,并將兩個參數拼接后返回。 function join<T>(first: T, second: T) { return `${first}${second}` } // 這里明確 T 為 string 類型 join<string>('第一', '第二') // 第一第二 // 這里通過類型推導的方式,編譯器會根據傳入的參數自動推斷出類型 join(1, 2) // 12
定義泛型是通過<>對尖括號來定義,我們在定義join函數的時候,并不知道可以接受那些類型,但是可以明確的是兩個類型是必須一樣的,如果想要滿足這樣的需求,不用泛型的話解決起來是沒有這么簡單的。
在調用函數的時候,這里使用了兩種方式,一種是直接指定類型為string類型;另一種是通過類型推導的方式,編輯器會根據傳入的參數自動幫助我們確定類型。
在定義一個函數時,我們可以使用多個泛型,而且返回值類型也可以通過泛型指定,只要在數量上和使用方式上能對應就可以。
示例代碼如下:
function identity<T, Y, P>(first: T, second: Y, third: P): Y { return second } // 指定類型 identity<boolean, string, number>(true, '字符串', 123) // 字符串 // 類型推斷 identity('string', 123, true) // true
我們不僅可以在函數中使用泛型,還可以在類中使用泛型。
示例代碼如下:
class DataManager<T> { // 定義一個類,該類中具有一個T類型的私有數組 constructor(private data: T[]) {} // 根據索引說數組中的值 getItem(index: number): T { return this.data[index] } } const data = new DataManager(['一碗周']) data.getItem(0) // 一碗周
而且泛型還可以繼承與于某個接口,示例代碼如下:
interface Item { name: string } class DataManager<T extends Item> { // 定義一個類,該類中具有一個T類型的私有數組 constructor(private data: T[]) {} // 根據索引說數組中的值 getItem(index: number): string { return this.data[index].name } } const data = new DataManager([{ name: '一碗周' }]) data.getItem(0) // 一碗周
使用extends
可以達到一個泛型約束 的作用,就上面那個代碼來說,我們必須約束傳入的值必有具有一個name屬性,否則就會拋出異常。
假如有如下需求,我們定義一個類,在類中一個私有對象,該對象中包含一些屬性;然后定義一個方法,通過key來獲取其對應的值。
實現代碼如下:
// 定義一個接口 interface Person { name: string age: number hobby: string } // 定義一個類 class Me { constructor(private info: Person) {} getInfo(key: string) { return this.info[key] } } const me = new Me({ name: '一碗周', age: 18, hobby: 'coding', }) // 調用 me.getInfo() 可能會得到一個 undefined 如下示例 me.getInfo('myName') // undefined
上面的代碼,如果我們調用示實例對象中的getInfo()
方法時,傳入一個沒有的屬性,會得到一個undefined。調用一個方法返回一個undefined
時,這并不是TypeScript
中的作風。
解決該問題可以通過keyof操作符,該關鍵字可以通過該操作符可以用于獲取某種類型的所有鍵,其返回類型是聯合類型。
示例代碼如下:
type myPerson = keyof Person // 'name' | 'age' | 'hobby'
那現在就可以通過該操作符解決上面出現的那個問題
示例代碼如下:
class Me { constructor(private info: Person) {} // 該寫法與如下寫法是一樣的 getInfo<T extends keyof Person>(key: T): Person[T] { return this.info[key] } // getInfo<T extends 'name' | 'age' | 'hobby'>(key: T): Person[T] { // return this.info[key] // } } const me = new Me({ name: '一碗周', age: 18, hobby: 'coding', }) // 調用 me.getInfo() 如果傳遞一個未知的屬性則會編譯錯誤 me.getInfo('myName') // error : 類型“"myName"”的參數不能賦給類型“keyof Person”的參數。
現在我們只要訪問對象中不具有的屬性編譯則會異常。
以上是“TypeScript 泛型怎么用”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。