zoukankan      html  css  js  c++  java
  • 【2019-12-13】泛型

    组件不仅能够支持当前的数据类型,同时也能支持未来的数据类型,这在创建大型系统时为你提供了十分灵活的功能

    1、泛型

     

     我们给identity3添加了类型变量T。T帮助我们捕获用户的传入的类型(比如:Number),之后我们就可以使用这个类型。之后我们再次使用了T当做返回值类型。现在我们可以知道参数类型与返回值类型是相同的了。

    这允许我们跟踪函数里使用的类型的信息

    我们把identity3函数叫做泛型,因为它可以适用于多个类型。不同于使用any,它不会丢失信息,像第一个例子那样保持准确性,传入数值类型并返回数值类型

    我们定义了泛型函数后,可以用两种方法使用

     

     对于output2我们没有使用尖括号<>来明确的传入类型;编译器可以查看 4 的值,然后把T设置为它的类型。类型推论帮助我们保持代码精简和高可读性。如果编译器不能够自动地推断出类型的话,只能像上面那样明确的传入T的类型。

    2、使用泛型变量

     

     我们也可以将泛型变量T 当做类型的一部分使用,而不是作为整个类型,如下:

     

     3、泛型类型

    上一节,我们创建了identity通用函数,可以适用于不同的类型。在这节,我们研究了一下函数本身的类型,以及如何创建泛型接口

     

     我们也可以使用不同的泛型参数名,只要在数量上和使用方式上能对应上就可以

     

     我们还可以使用带有调用签名的对象字面量来定义泛型函数

     

    这就引导我们去写第一个泛型接口,把上面例子中的对象字面量拿出来作为一个接口

     

    我们可以把泛型参数当做整个接口的一个参数。这样我们就能清楚的知道使用的具体是哪个泛型类型

     

    注意:不能创建泛型枚举和泛型命名空间

    4、泛型类

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

     

    与接口一样,直接把泛型类型放在类后面,可以帮助我们确认类的所有属性都在使用相同的类型。

    我们在类章节说过,类有两部分:静态部分和实例部分。泛型类型指的是实例部分的类型,所以类的静态属性不能使用这个泛型类型

    5、泛型约束

    我们直接操作泛型类型的参数,但是编译器不能证明每种类型都有length属性,所以就会报错

    相比于操作any所有类型,我们想要限制函数去处理带有.length属性的所有类型。只要传入的类型有这个属性。我们就允许,就是说至少包含这一个属性。为此,我们需要列出对于T的约束要求

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

     

     在泛型约束中使用类型参数

     

     如果键值不属于对象,则会报错

    在泛型里使用类类型

     

    使用原型属性推断并约束构造函数与类实例的关系

  • 相关阅读:
    asp.net core的DI框架思考以及服务实例的获取方式总结
    并发相关随笔(持续更新)
    为什么Dotnet Core的DI默认是在控制器中注入
    在控制台下玩玩dotnet core内置原生的DI
    asp.net core 依赖注入实现全过程粗略剖析(3)
    EF 下如何更新数据表数据
    asp.net core 依赖注入实现全过程粗略剖析(2)
    asp.net core 依赖注入实现全过程粗略剖析(1)
    【MongoDB 高可用篇】MongoDB Sharding Cluster启动和关闭过程
    【MongoDB 高可用篇】MongoDB Sharding Cluster集群环境搭建
  • 原文地址:https://www.cnblogs.com/QQ-lala/p/12036753.html
Copyright © 2011-2022 走看看