TypeScript学习摘要(五)——泛型

  • 使用了类型变量的对象叫做泛型,如函数泛型

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

    T是一个类型变量,类型变量只用于储存用户传入的类型

  • 泛型函数可通过<>尖括号显式传入类型参数,但一般情况下可让编译器自动判断类型

    let output = identity("myString"); // 显式传入类型
    let output = identity("myString");  // 自动判断类型
    

    数组泛型的使用也类似

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

泛型类型

  • 与非泛型函数类型类似

    function identity(arg: T): T {
        return arg;
    }
    
    let myIdentity: (arg: U) => U = identity;
    
  • 还可以使用带有调用签名的对象字面量来定义泛型函数

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

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

    也可以将泛型参数当做接口的参数

    interface GenericIdentityFn {
        (arg: T): T;
    }
    
    function identity(arg: T): T {
        return arg;
    }
    
    let myIdentity: GenericIdentityFn = identity;
    
  • 泛型类

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

泛型约束

  • 可以通过接口定义泛型参数的约束条件

    interface Lengthwise {
        length: number;
    }
    
    function loggingIdentity(arg: T): T {
        console.log(arg.length);  // Now we know it has a .length property, so no more error
        return arg;
    }
    
  • 还可以各种套娃

    // 在泛型约束中使用类型参数
    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(c: {new(): T; }): T {
        return new c();
    }
    

你可能感兴趣的:(TypeScript学习摘要(五)——泛型)