TypeScript(ts)学习笔记(六):泛型

初识泛型

如果我们想写一个函数,它的参数和返回值类型相同,首先我们会想到下面这种写法:

function getNum(num: number): number{
  return num;
}
function getStr(str: string): string{
  return str;
}

或者使用any来定义类型:

function getItem(arg: any): any{
  return arg;
}

但是使用any类型会导致我们无法保证参数类型与返回的类型一定是相同的。所以我们可以采用下面这种方式:

function identity(arg: T): T{
  return arg;
}

我们在函数名称后面声明变量,它用于捕获开发者传入的参数类型,然后我们就可以使用T做参数类型和返回值类型了。

泛型变量

现在假设我们想操作T类型的数组而不直接是T

function getArr(arg: T[]): T[]{
  return arg;
}
console.log(getArr([1,2])); //[1,2]

这里我们传入的是数字数组,将返回一个数字数组,因为此时T的的类型为number。 这时我们把泛型变量T当做类型的一部分使用,而不是整个类型。

泛型接口

interface GenericFn{
  (arg: T): T
}
function identity(arg: T): T {
  return arg;
}
let myIdentity: GenericFn = identity;
// let myIdentity: GenericFn = num=>num;

泛型类

class MyArr {
  arr: T[] = [];
  push(num: T) {
    this.arr.push(num)
  }
}
let a = new MyArr();
a.push(10);

泛型约束

type Params = number | undefined;
class MyArr {
  arr: T[] = [];
  push(num: T) {
    this.arr.push(num)
  }
}
let a1 = new MyArr();
let a2= new MyArr(); //类型“string”不满足约束“Params”

索引类型

function getValue(obj: object, key: string) {
  return obj[key]
}
image.png
function getValue(obj: T, key: U) {
    return obj[key];
}

我们用索引类型keyof T把传入的对象的属性类型取出生成一个联合类型,这里的泛型 U 被约束在这个联合类型中。

你可能感兴趣的:(TypeScript(ts)学习笔记(六):泛型)