泛型

什么是泛型?

泛型指的是类型参数化,即将原来某种具体的类型进行参数化。设计泛型的目的在于有效约束类型成员之间的关系,比如函数参数和返回值、类或者接口成员和方法之间的关系。

定义的时候, 不确定类型 , 调用的时候能确定 类型的参数

泛型类型参数

1function getValue(val: string): string {
2  return val;
3}
4
5function getValue1(val: number): number {
6  return val;
7}
8
9function getValue2(val: unknown): unknown {
10  return val;
11}
12
13let g1: string = getValue("1");
14let g2: number = getValue1(1);
15let g3: unknown = getValue2(1);
16
17function getValue3<T>(val: T): T {
18  return val;
19}
20
21let g4: number = getValue3<number>(3);
22let g5: string = getValue3<string>('4');

泛型类型

前面我们使用过Array<类型>来定义数组的类型,这里的Array也是一种类型。

在 TypeScript 中,类型本身就可以被定义为拥有不明确的类型参数的泛型,并且可以接收明确类型作为入参,从而衍生出更具体的类型。

1// 定义数组类型
2let arr: Array<number> = [1];
3let arr1: Array<string> = [""];
4
5// 类型别名
6type typeFn<P> = (params: P) => P;
7let fntype: typeFn<number> = (n: number) => {
8  return n;
9};
10
11let fn1:typeFn<string> = (p: string):string => {
12    return p;
13} 
14// 定义接口类型
15interface TypeItf<P> {
16  name: P;
17  getName: (p: P) => P;
18}
19
20let t1: TypeItf<number> = {
21  name: 123,
22  getName: (n: number) => {
23    return n;
24  },
25};
26
27let t2: TypeItf<string> = {
28  name: "123",
29  getName: (n: string) => {
30    return n;
31  },
32};

泛型约束

把泛型入参限定在一个相对更明确的集合内,以便对入参进行约束。

1interface TypeItf<P extends string | number> {
2  name: P;
3  getName: (p: P) => P;
4}
5
6let t1: TypeItf<number> = {
7  name: 123,
8  getName: (n: number) => {
9    return n;
10  },
11};
12
13let t2: TypeItf<string> = {
14  name: "123",
15  getName: (n: string) => {
16    return n;
17  },
18};