TypeScript(三)

五. 泛型

  1. 泛型定義:泛型就是解決類、接口、方法的復用性,以及對不特定數(shù)據(jù)類型的支持。 可以支持不特定的數(shù)據(jù)類型,傳入的參數(shù)類型和返回的參數(shù)類型一致。

    function getData<T>(value: T): T {
        return value;
    }
    // T表示泛型,具體什么類型是調(diào)用這個方法的時候決定的,如下:
    getData<number>(123);
    getData<string>('aaa');
    
  2. 泛型類:比如有個最小堆算法,需要同時支持返回數(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
    
  3. 泛型接口

    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')
    
  4. 深入泛型類:將類作為參數(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)
    
    
  5. 案例,操作數(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)
    
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容