软件工程中,我们不仅要创建一致的良好的API接口,同时也要考虑可重用性。组件不仅能够支持当前的数据类型,同时也支持将来的数据类型,这在创建大型功能时提供了十分灵活的功能。
泛型(Generics)是指在定义函数、接口或类的时候,不预先指定具体的类型,而在使用的时候再定义类型的这一特性。可以使用泛型来创建可重用的组件,一个组件支持多种数据类型,用户根据自己的数据类型来使用组件。
简单的例子
首先,我们实现一个函数 creatArray
,它可以创建一个指定长度的数组,同时将每一项都填充一个默认值:
上例中,我们在函数名后面添加 <T>
,其中 T
来指代任意的输入类型,我们称之为泛型变量,后面的 value: T
和 Array<T>
就可以使用了。在调用的时候再指定具体的数据类型 string / number
等。当然也可以不手动指定类型,而让类型推断自己判断。
多个类型参数
定义泛型的时候可以一次定义多个类型参数:
上面我们定义了一个 swap
函数,用来交换输入的元组。
泛型约束
在函数内部使用泛型变量的时候,由于事先并不知道它是那种数据类型,所以不能随意的操作它的属性或方法:
泛型 T
不一定包含属性 .length
,所以编译会报错。
我们可以对泛型进行约束,只允许这个函数传入那些包含 length
属性的变量。为此,我们定义一个接口来描述约束条件,使用 extends
关键字来实现约束。
调用 identity
的时候,传入的 arg
不含 length
在编译阶段就会报错。
多个类型参数之间也可以互相约束:
我们使用了两个类型参数,其中要求 T
继承 U
,这样就保证了 U
上不会出现 T
中不存在的字段。
泛型接口
可以使用含有泛型的接口来定义函数的形状: