何为泛型?

我们先定义一个东西

  1. function fn(a:number):number{
  2. return a;
  3. }

这个函数就是接收一个a然后把a的值返回

我们用这个说明一个问题:

我们去定义一个函数,定义一个类或变量的时候,我们都知道的类型是a:number知道返回值是number。但是有一些情况下,我们不知道参数的类型的时候,我们返回值的类型也不知道是啥

这个时候我们遇到不确定类型那怎么办?

我们可以写any但是我们之前说了any的问题就是any后会关闭我们ts中的类型检查,如果用any这个类型就没有意义了。而且从函数的类型和返回值来看,我们不能看出返回值的类型是和a是一样的

凡是遇到类型不明确的时候,我们就可以使用泛型

泛型

在定义函数或者类时,如果遇到类型不明确就可以使用泛型

泛型就是一个不确定的类型

根据调用的情况来具体的去看这种情况

泛型怎么去具体的指定?

  1. function fn<T>

泛型<K>不一定都叫K,这里指定为泛型T,名字无所谓

T:就表示任意类型,感觉就像是一个变量

后面就跟普通方法一样了:

  1. function fn<T>*(a:T):T{//表示a和返回值的类型是T
  2. return a;
  3. }

这样,这个函数就定义好了,但是T具体是什么类型?

不知道。这个类型只有在函数执行的时候才可以去确定

好处:

  • 1.首先不用any,any吧类型检查跳过了
  • 2.体现出了我的参数和返回值它的类型是相同的

怎么用?

  1. fn(10)

因为我们a的类型是10(number)它会自动判断出a的类型是number,也就是把number赋值给了T,也就意味着这个T的值就是number。但是这里用到了ts里类型的自动判断。

要是有的时候自动推断不出来,我们可以这么写:

  1. fn<string>('hello');

这个时候我们就手动的指定这个Tstring

好处是:类型是明确

泛型可以指定多个

  1. function fn2<T,K>(a:T,b:K):T{
  2. console.log(b);
  3. return a;
  4. }
  5. fun2(123,'hello');//自动推断
  6. fun2<number,string>(456,'hi');//最好还是手动的添加上,以免出错的机率

但是我们这样,我们的泛型可以是任意类型,那有一些情况下我想限制一下泛型的范围

限制泛型的范围

  1. interface Inter{
  2. length:number;
  3. }
  4. function fn3<T extends Inter>(a:T):number{
  5. return a.length
  6. }

总结

  • 泛型可以同时指定多个
  • **T extends Inter**表示这个泛型必须是**Inter**的实现类(子类)
  • 在我们类中也可以定义**泛型**
  1. class MyClass<T>{
  2. name: T;
  3. //用的时候也一样
  4. constructor(name:T){
  5. this.name = name;
  6. }
  7. }
  8. //泛型是一个井上添花的东西,不是一定要使用
  9. const mc = new MyClass<string>('孙悟空')

关于抽象类接口泛型js里面都是没有的,都是在ts里面新加的。