8.泛型

目录

1  基本使用

2  多个泛型

3  泛型约束

3.1  数组

3.2  extends约束

3.3  用泛型约束泛型

4  泛型接口

5  ts中的数组用的就是泛型

6  泛型类

7  常用泛型工具类型

7.1  让所有属性变为可选属性 Partial

7.2  将所有属性都变为只读属性 Readonly

7.3  从指定类型中提取若干个组成新类型 Pick

7.4  构造一个对象规则,一个参数是键名,第二个参数是值类型 Record


1  基本使用

我现在想定义一个函数规则,函数只有一个参数,规则是给参数什么类型的值,就返回什么类型的数据。这个时候直接将参数与返回值都置为any是约束不住的

8.泛型_第1张图片

这个时候我们可以使用泛型,使用泛型之后,像上面那样的函数你就定义不出来了。因为你用String就铁定是字符串类型了,但是泛型要求是活类型

  • <>内是泛型的名称,我这里使用something做名称,名称可自定

8.泛型_第2张图片

如果没报错就说明输入和输出是同一个类型

8.泛型_第3张图片

在使用的时候你可以选择不对泛型进行约束

8.泛型_第4张图片

不约束就相当于ts根据你给的参数进行类型推断

也可以对给泛型一个具体的类型

8.泛型_第5张图片

2  多个泛型

8.泛型_第6张图片

3  泛型约束

3.1  数组

像下面这样描述数组应该是个例,我试过改成个对象就不行了,而且你的数组中没法加内容,也无法指定数组中各元素的类型

我们想在想传入一个数组,但是默认情况下不让你使用length这个属性

8.泛型_第7张图片

那就只能给something约束为有length属性,比如数组

8.泛型_第8张图片

不一定所有的泛型都要带约束,我下面这个函数表示输入是一个数组,但输出不一定是一个数组

8.泛型_第9张图片

3.2  extends约束

我们更好理解的是extends,比如我下面让something属于 number或object或string

由于你使用了 或,还是有可能没有length属性

这个时候你可以继承一个数组

8.泛型_第10张图片

也可以继承一个有length属性的东西,比如自定义一个接口

8.泛型_第11张图片

3.3  用泛型约束泛型

比如我现在搞一个获取属性的方法,我约束something2必须为something1的键

我怕们上面没有对something1进行约束,所以你可以用其他的类型,比如数字型,数字型本身也是个对象,你可以用数字型中的属性

如果是可遍历的东西就把key当索引用

4  泛型接口

接口也可以使用泛型,比如我让接口Person上有泛型something,然后someone被Person约束,指定泛型类型为string

8.泛型_第12张图片

5  ts中的数组用的就是泛型

如果你的数组中都是数值,它就会提示你number

8.泛型_第13张图片

如果你的数组中都是字符串,它就会提示你string

8.泛型_第14张图片

按住ctrl然后点击forEach可以看到源码,在源码中使用的是名称为T的泛型

8.泛型_第15张图片

6  泛型类

泛型可以应用在类中的每一个变量

比如属性

8.泛型_第16张图片

比如方法

8.泛型_第17张图片

7  常用泛型工具类型

7.1  让所有属性变为可选属性 Partial

我现在用something规则约束对象a,此时对象a 必须 要拥有 something 的全部属性

8.泛型_第18张图片

我们对 规则something 进行 Partial 修饰 得到 规则something1。something1会把something中的规则都变为可选规则(相当于都加了一个问号),这样再创建对象a的时候就不必须有something的全部属性

8.泛型_第19张图片

7.2  将所有属性都变为只读属性 Readonly

先看不加Readonly的情况,不加Readonly所有的属性都是非只读属性,你可以对任何的属性进行修改

8.泛型_第20张图片

加了Readonly后,所有属性变为只读属性,这样就改不了了

8.泛型_第21张图片

7.3  从指定类型中提取若干个组成新类型 Pick

定义规则something,从something中提取id与title组成新属性something1。以something1为规则的实例对象只需要有id和title两个属性就行

8.泛型_第22张图片

7.4  构造一个对象规则,一个参数是键名,第二个参数是值类型 Record

我现在创造一个对象规则something,something的键名有 id name title。这三个键的属性需要是数字或字符串

8.泛型_第23张图片

如果你 id name title 每个都不一样,建议你搞个interface一个一个写上 

你可能感兴趣的:(Typescript笔记,typescript)