泛型 泛型,在强类型程序设计语言中编写代码时使用一些以后才指定的类型,在实例化时作为参数指明这些类型,各种程序设计语言和其编译器、运行环境对泛型的支持均不一样。泛型程序设计(genericprogramming)是程序设计语言的一种风格或范式。 泛型(Generics)是指在定义函数、接口或类的时候,不预先指定具体的类型,而在使用的时候再指定类型的一种特性。 泛型的特点 1、支持多种类型的数据(不特定的数据类型);2、传入的类型与返回的类型应该是相同的。3、使用类型变量且指标是类型,不是值;4、泛型的类型取决于调用的时候传入的参数类型;5、对不特定类型数据的校验。 泛型的案例 1、泛型函数;2、泛型类;3、泛型函数类型的接口;4、泛型约束。代码案例: 案例1:定义泛型函数functionidentityT(arg:T):T{returnarg;}类型推论,编译器会根据传入的参数自动地确定T的类型letidentity1identity(identity1);console。log(identity1,identity1);指定了T是string类型,作为一个参数传给函数letidentity2identitystring(identity2);console。log(identity2,identity2);定义泛型函数letshowInfoT(val:T):Tval;letmyNameshowInfostring(myName);console。log(myName,myName);泛型类classMinObjectT{publiclist:T〔〕〔〕;add(value:T):void{this。list。push(value);}min():T{letminValuethis。list〔0〕;for(vari0;ithis。list。length;i){if(minValuethis。list〔i〕){minValuethis。list〔i〕;}}returnminValue;}}实例化类,并且规定类的T(泛型)代表numbervarminObject1newMinObjectnumber();minObject1。add(2);minObject1。add(3);minObject1。add(9);minObject1。add(1);console。log(minObject1。min(),minObject1。min());实例化类,并且规定类的T(泛型)代表stringvarminObject2newMinObjectstring();minObject2。add(b);minObject2。add(c);minObject2。add(d);minObject2。add(a);console。log(minObject2。min(),minObject2。min());函数类型接口interfaceConfigFn1{(value1:string,value2:string):string;}vargetData1:ConfigFn1function(value1:string,value2:string):string{returnvalue1value2;}console。log(getData1(),getData1(name,小奋斗,1));泛型函数类型的接口interfaceConfigFn2{T(value:T):T;}vargetData2:ConfigFn2functionT(value:T):T{returnvalue;}console。log(getData2(),getData2(小奋斗,2));泛型函数类型接口interfaceConfigFn3T{(value:T):T;}vargetData3:ConfigFn3stringfunctionU(value:U):U{returnvalue;}console。log(getData3(),getData3(小奋斗,3)); 输出:identity1identity1identity2identity2myNamemyNameminObject1。min()1minObject2。min()agetData1()name小奋斗,1getData2()小奋斗,2getData3()小奋斗,3 案例2:泛型约束定义接口,接口规定必须有length这一属性。interfaceLengthwise{length:number}使用接口和extends关键字实现约束,此时T类型就必须包含length这一属性。functionechoValueTextendsLengthwise(arg:T):T{console。log(arg。length)通过,因为被约束的T类型是包含length属性的returnarg}echoValue(33)类型number的参数不能赋给类型Lengthwise的参数。console。log(echoValue(),echoValue({value:30,length:100}));console。log(echoValue(),echoValue(〔10,20,30,40〕));泛型约束中使用类型参数constgetProps(obj,propName){returnobj〔propName〕}consto{a:aaaaa,b:bbbbb}console。log(getProps,getProps(o,c));getPropsundefinedconsole。log(getProps,getProps(o,a));getPropsaaaaa应用泛型keyof用于遍历某种类型的属性(可以操作接口、类以及基本数据类型)constgetProps2T,KextendskeyofT(obj:T,propName:K){returnobj〔propName〕}consto2{a:aaaaa,b:bbbbb}console。log(getProps,getProps2(o2,c));类型c的参数不能赋给类型ab的参数。console。log(getProps2,getProps2(o2,b));getProps2bbbbb 输出:100echoValue(){value:30,length:100}4echoValue()〔10,20,30,40〕getPropsundefinedgetPropsaaaaagetProps2bbbbb