一、 泛型是什么
软件工程中,我们不仅要创建一致的定义良好的 API ,同时也要考虑可重用性。 组件不仅能够支持当前的数据类型,同时也能支持未来的数据类型,这在创建大型系统时为你提供了十分灵活的功能。
在像 C# 和 Java 这样的语言中,可以使用泛型来创建可重用的组件,一个组件可以支持多种类型的数据。 这样用户就可以以自己的数据类型来使用组件。
—— 官方文档介绍
官方文档说的有点晕,不过既然介绍提到了 Java ,那就看看泛型在 Java 的解释:
Java 泛型是 J2 SE1.5 中引入的一个新特性,其本质是参数化类型,也就是说所操作的数据类型被指定为一个参数(type parameter)这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。
—— 百度百科
对于参数我们就比较熟悉了,在定义函数的时候写入形参,后面调用的时候再传入具体的实参;同样的,参数化类型也就是将原先的具体的类型当做一个参数来处理,在定义阶段就相当于定义函数时候的形参一样,没有指定的类型,只是相当于一个占位符的作用,而后在使用阶段的时候根据传入的类型来确定。
也就是说在泛型使用过程中,操作的数据类型被指定为一个参数,这种参数类型可以用在类、接口和方法中,也就被分别称为泛型类、泛型接口、泛型方法。
TypeScript泛型类型参数的实际命名约定非常一致:使用单个大写字符,或者对应于它们所表示的第一个字母,例如:
- T为“type”,是最通用的,因此也是最常用的类型参数名;
- K表示“key”,或P表示“property”,两者都倾向于受PropertyKey或keyof T或keyof SomeInterface或keyof SomeClass的约束;
- V表示“value”,最常用作成对使用,K表示“key”;
- A表示“arguments”,R表示“return”,分别对应函数签名的rest参数列表和返回类型,如(...args: A) => R;
- N表示“number”,S表示“string”,B表示“boolean”,表示受原语约束的类型参数;