本文主要介绍TypeScript中泛型的新概念、泛型的用法、泛型与接口的结合。在实际应用中,可能会遇到求最小值的问题,比如求一个数组中的最小值。在ts中需要两种写法,一种是数字,一种是字符串。这样写不利于代码复用。当项目较大时,性能较差,工作效率也较低,因此在ts中引入了泛型的概念。functiongetMin1(arr:number[]):number{letmin=arr[0]for(vari=1;iarr[i]){min=arr[i]}}returnmin}console.log(getMin1([1,2,3,4]));functiongetMin2(arr:string[]):string{让min=arr[0]for(vari=1;我arr[i]){min=arr[i]}}returnmin}console.log(getMin2(['a','b','c']));1。什么是泛型?泛型是英文泛型,意思是在定义一个函数、接口或类时,不事先指定具体的类型,而是在使用时指定类型。定义方法:functionfnName(arg:T,...):T{return...}泛型变量通常用T表示,可以表示任何类型。所以,我们可以把上面的例子改成下面的代码:functiongetMin(arr:T[]):T{letmin=arr[0]for(vari=1;iarr[i]){min=arr[i]}}returnmin}getMin([1,2,3,4])getMin(['a','b','c','d'])在上面的代码中,T的主要作用是帮我们捕获用户传入的类型,比如:number或者string。另外编译器会根据传入的参数自动帮我们进行类型推断,然后将T设置为其类型,所以类型可以忽略,如:getMin([1,2,3,4])getMin(['a','b','c','d'])在一些复杂的情况下,为了防止编译器自动推断出类似的故障,尽量传入类型,以防出错。2.泛型类型泛型函数的类型和非泛型函数的类型有什么区别?它们看起来很相似,泛型函数类型前面多了一个类型参数。泛型函数类型还有如下特点:a>、泛型函数类型可以有多个参数functionfn(arg1:T,arg2:U){returnarg1}b>、泛型函数可以使用不同的泛型参数名称functionfn(arg1:T){returnarg1}letFn:(arg1:M)=>M=fnc>,可以用对象字面量定义泛型Functionfunctionfn(arg1:T){returnarg1}letFn:{(arg:T):T}=fn3,泛型接口当以对象字面量的方式定义泛型函数时,对象接口的形式可以替换为interface的形式,改为:letFn:{(arg:T):T}=fn//替换为interfaceFnInter{(arg:T):T}letFn:有问题以这种方式使用FnInter=fn:该函数对数据类型一无所知,无法使用某种数据类型进行操作。所以需要改进一下,将类型作为参数传入,比如:interfaceFnInter{(arg:T):T}letFn:FnInter=fn这样我们就可以清楚的知道是哪个泛型是使用类型类型。我们把整个接口当作一个泛型参数,称为泛型接口。它的好处是我们可以清楚的知道参数的数据类型,接口中的成员也可以知道参数的具体类型。4.泛型类除了有泛型接口,还有接口类。泛型类类似于泛型函数。语法格式为:classname{}newclassname()classGetMin{arr:T[]=[]add(ele:T){this.arr.push(ele)}getMin():T{varmin=this.arr[0]for(vari=0;ithis.arr[i]){min=this.arr[i]}}returnmin}}letgMin1=newGetMin()gMin1.add(1)gMin1.add(5)console.log(gMin1.getMin());//1letgMin2=newGetMin()gMin2.add('a')gMin2.add('b')console.log(gMin2.getMin());//25.泛型约束泛型的功能确实强大,但也不是万能的。例如:functiongetLength(val:T):number{returnval.length;}错误信息提示:类型“T”上不存在属性“length”。原因是只有字符串和数组有length属性,number和object没有length属性,所以报错。解决办法是保证传入的数据类型有length属性,所以需要使用泛型约束。泛型约束主要通过interface+extends关键字实现。接口ILen{length:number}functiongetLength(val:T):number{returnval.length;}console.log(getLength("abcd"));console.log(getLength(1));//错误消息:类型“number”不满足约束“ILen”。使用泛型约束的好处是可以帮助我们自动检测传入的值是否符合约束类型的值,如果不满足就会显示错误信息。6.泛型参数的默认类型TypeScript2.3之后,可以在泛型中为类型参数指定默认类型。当在没有指定参数类型的情况下使用泛型,而编辑器无法从实际参数中推断出数据类型时,它会使用默认类型。使用简单:interfaceP{name:T}letp1:P={name:"小姐姐"}letp2:P={name:18}泛型参数的默认类型遵循以下规则:具有默认类型的类型参数被认为是可选的。必需的类型参数不能跟在可选的类型参数之后。如果类型参数有约束,则类型参数的默认类型必须满足这个约束。指定类型参数时,只需为需要的类型参数指定类型参数即可。未指定的类型参数被解析为其默认类型。如果指定了默认类型,而类型推断无法选择候选类型,则将使用默认类型作为推断结果。与现有类或接口合并的类或接口声明可以为现有类型参数引入默认类型。与现有类或接口合并的类或接口的声明可以引入新的类型参数,只要它指定默认类型即可。7.通用条件类型在typeScript2.8中,引入了条件类型。我们可以根据一定的条件得到不同的类型。这里的条件是类型兼容性约束。条件类型会检测与某个条件表达式的类型关系,从而从两种类型中选择一种:使用语法:TextendsU?X:Y上述表达式的意思是:如果T可以赋值给U,则类型为X,否则为Y。