TypeScript學(xué)習(xí)摘要(五)——泛型

  • 使用了類型變量的對(duì)象叫做泛型,如函數(shù)泛型

        function identity<T>(arg: T): T {
            return arg;
        }
    

    T是一個(gè)類型變量,類型變量只用于儲(chǔ)存用戶傳入的類型

  • 泛型函數(shù)可通過<>尖括號(hào)顯式傳入類型參數(shù),但一般情況下可讓編譯器自動(dòng)判斷類型

    let output = identity<string>("myString"); // 顯式傳入類型
    let output = identity("myString");  // 自動(dòng)判斷類型
    

    數(shù)組泛型的使用也類似

    function loggingIdentity<T>(arg: T[]): T[] {
    // 等同于function loggingIdentity<T>(arg: Array<T>): Array<T> {
        console.log(arg.length);  // Array has a .length, so no more error
        return arg;
    }
    

泛型類型

  • 與非泛型函數(shù)類型類似

    function identity<T>(arg: T): T {
        return arg;
    }
    
    let myIdentity: <U>(arg: U) => U = identity;
    
  • 還可以使用帶有調(diào)用簽名的對(duì)象字面量來定義泛型函數(shù)

    function identity<T>(arg: T): T {
        return arg;
    }
    
    let myIdentity: {<T>(arg: T): T} = identity;
    
  • 泛型接口

    interface GenericIdentityFn {
        <T>(arg: T): T;
    }
    
    function identity<T>(arg: T): T {
        return arg;
    }
    
    let myIdentity: GenericIdentityFn = identity;
    

    也可以將泛型參數(shù)當(dāng)做接口的參數(shù)

    interface GenericIdentityFn<T> {
        (arg: T): T;
    }
    
    function identity<T>(arg: T): T {
        return arg;
    }
    
    let myIdentity: GenericIdentityFn<number> = identity;
    
  • 泛型類

    class GenericNumber<T> {
        zeroValue: T;
        add: (x: T, y: T) => T;
    }
    
    let myGenericNumber = new GenericNumber<number>();
    

泛型約束

  • 可以通過接口定義泛型參數(shù)的約束條件

    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 error
        return arg;
    }
    
  • 還可以各種套娃

    // 在泛型約束中使用類型參數(shù)
    function getProperty(obj: T, key: K) {
        return obj[key];
    }
    
    let x = { a: 1, b: 2, c: 3, d: 4 };
    
    getProperty(x, "a"); // okay
    getProperty(x, "m"); // error: Argument of type 'm' isn't assignable to 'a' | 'b' | 'c' | 'd'.
    
    // 在泛型里使用類類型
    function create<T>(c: {new(): T; }): T {
        return new c();
    }
    
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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