泛型
介绍
泛型程序设计(generic programming)是程序设计语言的一种风格或范式。泛型允许程序员在强类型程序设计语言中编写代码时使用一些以后才指定的类型,在实例化时作为参数指明这些类型。各种程序设计语言和其编译器、运行环境对泛型的支持均不一样。
泛型的定义主要有以下两种:
- 在程序编码中一些包含类型参数的类型,也就是说泛型的参数只可以代表类,不能代表个别对象。(这是当今常见的定义)
- 在程序编码中一些包含参数的类。其参数可以代表类或对象等等。(现在人们大多把这称作模板)
软件工程中,我们不仅要创建一致的定义良好的API,同时也要考虑可重用性。 组件不仅能够支持当前的数据类型,同时也能支持未来的数据类型,这在创建大型系统时为你提供了十分灵活的功能。
在像C#和Java这样的语言中,可以使用泛型来创建可重用的组件,一个组件可以支持多种类型的数据。这样用户就可以以自己的数据类型来使用组件。
Hello World泛型
不用泛型定义的函数,如下
function helloworld(name: string): string {
return name;
}
也可以用any
来指代任意类型
function helloworld(name: any): any {
return name;
}
但是用any
会丢失类型信息,传入的类型和返回的类型是应该是一样的,但是我们知道传入的类型和返回的类型可以任意,包含可以不相同,所以我们要有一种机制能确保入参和出参能一样,于是泛型就出现了。
function helloworld<T>(name: T): T {
return name;
}
T
代表泛型的意思,你可以用任意一个大写字母或单词表示
两种方式可以调用
const result = helloworld<string>("Hello, TS"); // result is "Hello, TS"
const result2 = helloworld("Hello, TS"); // result is "Hello, TS"
第二种方式不传类型信息,编译器可自动识别泛型对应的具体类型
数组泛型
定义如下
function arrayGenerics<T>(param: T[]): T[] {
console.log(param.length);
return T;
}
由于定义了数组泛型,所以可以使用数组上的相关属性和方法,比如上面调用了数组的length
属性
泛型类型
泛型类型和函数其实差不多,如下所示定义了一个函数泛型,然后将其赋值给泛型类型变量myGenericsType
function genericsType<T>(param: T): T {
return T;
}
let myGenericsType: <T>(param: T) => T = genericsType; // 正常方式
let myGenericsType2: { <T>(param: T): T } => T = genericsType; // 带有调用签名的对象字面量来定义泛型函数