2020年11月12日

ts-泛型

作者 rourou

泛型是解决类 接口 方法的复用性以及不特定数据类型的支持。可以使用泛型来创建可重用的组件,一个组件可以支持多种类型的数据。 这样用户就可以以自己的数据类型来使用组件。

  • 泛型函数
function getData<T>(val:T):T{
  return val;
}
getData<number>(123);
getData<string>('123');

T表示泛型函数,具体什么类型是调用这个方法的时候决定。通过<xxx>来决定

  •  泛型类:比如有最小堆算法,需要同时支持返回数字和字符串两种类型。
class minClass<t>{
  list:t[] = [];
  add(val:t){
    this.list.push(val);
  }
  min():t{
    var minNum = this.list[0];
    for(var i=0;i<this.list.length;i++){
      if(minNum>this.list[i]){
        minNum = this.list[i];
      }
    }
    return minNum;
  }
}

var m = new minClass<number>();
m.add(2);
m.add(12);
m.add(32);
m.add(8);
m.min();//2
  • 泛型接口
interface con{
  <t>(val:t):t;
}
var getDatas:con =function<t>(val:t):t{
  return val;
}
getData<string>('a')


interface con1<t>{
  (val:t):t;
}
var getDatas1:con1<string> =function<t>(val:t):t{
  return val;
}
getDatas1('a');
  • 泛型类

把类当作参数的泛型类,约束数据传入的类型

class User{
  userName:string | undefined;
  password:string | undefined;
}

class mysql{
  add(user:User):boolean{
    console.log(user);
    return true;
  }
}
// 泛型类
class mysql1<t>{
  add(user:t):boolean{
    console.log(user);
    return true;
  }
}

var u = new User();
u.userName = 'a'
u.password = '123'

var my = new mysql();
my.add(u);

var my1 = new mysql1<User>();
my1.add(u);