• TypeScript入门-泛型


    泛型

    要创建一个可重用的组件,其中的数据类型就必须要兼容很多的类型,那么如何兼容呢,TypeScript提供了一个很好的方法:泛型

    Hello World

    要兼容多种数据格式,可能会有人想到any,即

    function identify(arg: any): any{
        return arg;
    }

    使用any存在一个问题,有可能传入的值和返回的值不是同一种值,例如,传入数字,但是不确定返回的是什么值

    要解决这个问题,我们需要引入类型变量-一种特殊的变量,只用于表示类型不表示值

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

    给identify添加了类型变量T,用来捕获传入值的类型,然后将返回值的类型也设置为T,就实现了传入值和返回值为同一类型值的需求

    我们把identify这个函数叫做泛型,因为它适用于所有类型,并且不会有any类型存在的问题

    使用泛型的方法有两种:

      1、传入所有的参数,包括类型参数

    let output = identify<string>('qwe');

      2、利用类型推论--即编译器会根据传入的参数自动地帮助我们确定T的类型

    let output = identify('qwe');

    泛型变量

    在泛型中,我们要合理正确的使用泛型变量T,要牢记T表示任何类型

    错误使用:

    function identify<T>(arg: T): T {
        console.log(arg.length);// Error: T doesn't have .length
        return arg;
    }

    在泛型中我们使用了length这个属性,但是T代表任何类型,所以有可能是number,而number是没有length属性的,所以会报错

    如果想要使用length这个属性,我们可以创建数组

    function identify<T>(arg: T[]): T[] {
        console.log(arg.length);// Error: T doesn't have .length
        return arg;
    }

    泛型类型

    泛型函数的类型与非泛型函数的类型没什么不同,只是有一个类型参数在最前面,像函数声明一样:

    function identify<T>(arg: T): T {
        return arg;
    }
    
    let myIdentify: <U>(arg: U) => U = identify;

    从上面的代码中可以看出也可以使用不同的泛型参数名,只要在数量上和使用方式上能对应上就可以

    当然也可以把泛型参数当做一个接口的参数,这样就可以知道这个接口具体用的是那种类型

    interface GenericIdnetify<T>{
        (arg: T): T;
    }
    
    function identity<T>(arg: T): T{
        return arg;
    }
    
    let myGenericidentify: GenericIdnetify<string> = identity;

    泛型类

    泛型类看上去与泛型接口差不多。 泛型类使用( <>)括起泛型类型,跟在类名后面。

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

    泛型约束

    在前面的泛型变量中遇到了一个问题,就是在泛型中调用参数的length时,如果参数没有Length属性会报错,而使用泛型约束,就是只有满足一定的条件才可以使用这个泛型

    为此,我们定义一个接口来描述约束条件。 创建一个包含 .length属性的接口,使用这个接口和extends关键字还实现约束:

    interface lengthwise{
        length: number;
    }
    
    function identity<T extends lengthwise>(arg: T): T{
        console.log(arg.length);
        return arg;
    }
    
    identity(123); //error
    
    identity('qwe'); //true

    当传入123时,没有length属性,就报错,而传入字符串qwe时则完全正确

    参考资料:

            TypeScript中文网 · TypeScript——JavaScript的超集

  • 相关阅读:
    6-Python爬虫-分布式爬虫/Redis
    ES 查询时 排序报错(fielddata is disabled on text fileds by default ... )解决方法
    Intellij Idea webstorm 激活
    Intellij Idea 配置jdk
    java 获取(格式化)日期格式
    js 跳转 XSS漏洞 预防
    CSS去掉背景颜色
    js对象无法当成参数传递 解决方法
    Elasticsearch java api
    java多条件查询SQL语句拼接的小技巧
  • 原文地址:https://www.cnblogs.com/qqandfqr/p/6795292.html
Copyright © 2020-2023  润新知