class minClass {
public list:number[] = []
add(num:number) {
this.list.push(num)
}
minNumber():number {
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()
m.add(1)
m.add(2)
console.log(m.minNumber())
}
class minClass2<T> {
public list:T[] = []
add(value:T)void {
this.list.push(value)
}
minNumber():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 minClass2<number>();
m.add(1);
m.add(2);
var m2 = new minClass2<string>();
m2.add('a');
m2.add('b');
interface ConfigFn {
(v1:string,v2:string):string;
}
let setData:ConfigFn = function(v1:string,v2:string):string {
return v1 + v2;
}
interface ConfigFn2 {
<T>(value:T):T;
}
let getData:ConfigFn2 = function<T>(value:T):T {
return value
}
interface ConfigFn3<T>{
(value:T):T;
}
let myGetData:ConfigFn3<string> = function<T>(value:T):T{
return value;
}
- 泛型类
- 把类作为参数来约束数据传入的类型:定义一个User的类这个类的作用就是映射数据库字段,然后定义一个MysqlDb的类用于操作数据库,之后把user类作为参数传入到MysqlDb中
class User {
userName:string | undefined;
password:string | undefined;
}
class MySqlDB {
add(user:User):boolean {
console.log(user)
return true
}
}
class Person {
name:string | undefined;
age:number | undefined;
id:number | undefined;
constructor(params:{
name:string | undefined,
age:number | undefined,
id?:number | undefind
}) {
this.name = params.name;
this.age = params.age;
this.id = params.id;
}
}
let p = new Persion({
name:'张三',
age:20
})
泛型的使用方法
function test<T>(arg:T):T {
return arg;
}
- 可以用两种方法使用
-
- 传入所有参数,包括类型参数
let out = test<string>('yivi');
- 2.使用类型推论,编译器会自动进行类型推断
let out = test('yivi');
- 泛型变量
function test<T>(arg:T):T { console.log(arg.length) // error,arg的类型为T,无明确指示方法,因此报错 return arg; }
- 当操作T类型的数组时,.length的属性是存在的,因此不会报错
function test<T>(args : T[]):T[] {
console.log(args.length)
return args;
}
function test<T>(args:Array<T>):Array<T> {
console.log(args.length)
return args;
}