五. 泛型
-
泛型定義:泛型就是解決類、接口、方法的復用性,以及對不特定數(shù)據(jù)類型的支持。 可以支持不特定的數(shù)據(jù)類型,傳入的參數(shù)類型和返回的參數(shù)類型一致。
function getData<T>(value: T): T { return value; } // T表示泛型,具體什么類型是調(diào)用這個方法的時候決定的,如下: getData<number>(123); getData<string>('aaa'); -
泛型類:比如有個最小堆算法,需要同時支持返回數(shù)字和字符串兩種類型。通過類的泛型來實現(xiàn)。
class MinClass<T> { public list: T[] = [] add(value: T) { this.list.push(value) } min(): T { let minNum = this.list[0]; for(let i = 0; i < this.list.length; i++) { if (minNum > this.list[i]) { minNum = this.list[i] } } return minNum; } } let m1 = new MinClass<number>(); m1.add(10) m1.add(20) m1.add(30) console.log(m1.min()) // 10 let m2 = new MinClass<string>(); m2.add(c) m2.add(a) m2.add(b) console.log(m2.min()) // a -
泛型接口
interface ConfigFn<T> { // 相當于定義了參數(shù),具體類型在調(diào)用類的時候進行傳參。 (value: T): T; } function getData<T>(value: T): T { return value; } let myData1: ConfigFn<number> = getData; myData1(123) let myData2: ConfigFn<string> = getData; myData('aaa') -
深入泛型類:將類作為參數(shù)傳入到泛型里面來約束傳入的參數(shù)。
class MysqlDb<T> { add(info: T): boolean { console.log(info) return true } } class User { username: string | undefined; password: string | undefined; } class ArticleCate { title: string | undefined; desc: string | undefined; status: number | undefined; constructor(params: { title: string | undefined, desc: string | undefined, status?: number | undefined }) { this.title = params.title this.desc = params.desc this.status = params.status } } let u = new User() u.username = '張三' u.password = '123456' let a = new ArticleCate({ title: '文章標題', desc: '文章概述', status: 1 }) let db = new MysqlDb<User>() // 實例化的時候傳入泛型參數(shù) db.add(u) // 這里傳入的參數(shù)需要遵循傳入的泛型參數(shù) let db1 = new MysqlDb<ArticleCate>(); db1.add(a) -
案例,操作數(shù)據(jù)庫(實現(xiàn)add, update, delete, get方法)
interface DBI<T> { add(info: T): boolean; update(info: T, id: number): boolean; delete(id: number): boolean; get(id: number): any[] } // 操作mySql的類 class MysqlDb<T> implements DBI<T> { // 注意:要實現(xiàn)泛型接口,這個類也應該是一個泛型類 constructor() { console.log('建立數(shù)據(jù)庫連接') } add(info: T): boolean { console.log(info, '添加操作') return true } update(info: T, id: number): boolean { console.log(id, info, '更新操作') return true } delete(id: number): boolean { console.log('刪除操作') return true } get(id: number): any[] { let list = [ { title: 'xxxx', desc: 'xxxx' } ] return list } } // User類 class User { username: string | undefined; password: string | undefined; } let u = new User(); u.username = '張三' u.password = '123456' let mysql = new MysqlDb<User>(); mysql.add(u); let data = mysql.get(3) console.log(data)