TypeScript教程(十一)多个泛型参数的函数和泛型接口
日期:2021-04-19
来源:程序思维浏览:3481次
一个函数也可以有多个泛型参数,接下来看一下代码示例:
function createMan<T,K>(name:T,age:K):[T,K]{
return [name,age];
}
let result=createMan<string,number>("张三",30);
console.log(result[0],result[1]);//结果:张三 30
定义多个泛型参数使用逗号做分隔符<T,K>,分别将泛型的T和K设置为参数name和age的类型,该函数返回的是一个元组,所以返回的类型设置为[T,K],T对应的name,K对应的age。
在定义接口时,可以为接口中的属性或方法定义泛型类型,在使用接口时,在指定具体的泛型类型。
接下来看一下泛型接口在函数中如何使用,代码示例如下:
interface ICreate{
<T>(name:string,age:T):string
}
let func:ICreate=function<T>(name:string,age:T):string{
return name+","+age
}
func<number>("李四",20);//结果:李四,20
创建一个ICreate接口,里面定义了一个泛型函数的约束,<T>表示声明函数时必须是泛型格式,(name:string,age:T)表示声明函数时必须有name和age两个参数,两个参数的类型分别为string和泛型T,声明变量func使用接口ICreate进行约束,赋值函数时必须按照接口的规范声明函数。使用func函数时<number>表示泛型T为number类型,这时参数age:T会映射为age:number,所以传入的值必须是number类型即“20”。
再来看一下泛型接口在类中如何使用,代码示例如下:
//泛型接口
interface IUser<T>{
name:string;
age:number;
getUserInfo:()=>T
}
//定义一个用户类
class User implements IUser<string>{
public name:string;
public age:number;
constructor(name:string,age:number){
this.name=name;
this.age=age;
}
getUserInfo(){
return `姓名${this.name},年龄${this.age}`;
}
}
let user=new User("张三",30);
console.log(user.getUserInfo());//结果:姓名张三,年龄30
首先定义一个泛型接口IUser<T>,<T>表示类继承接口时传入的类型,T可以想象成接口的参数,可以在接口的属性或方法中使用,可以看到该接口内部的方法getUserInfo约束的类型是一个方法并且返回值的类型为泛型T。接下来在User类中继承IUser接口并传入指定类型<string>,表示getUserInfo方法返回的值必须是string类型。
function createMan<T,K>(name:T,age:K):[T,K]{
return [name,age];
}
let result=createMan<string,number>("张三",30);
console.log(result[0],result[1]);//结果:张三 30
定义多个泛型参数使用逗号做分隔符<T,K>,分别将泛型的T和K设置为参数name和age的类型,该函数返回的是一个元组,所以返回的类型设置为[T,K],T对应的name,K对应的age。
在定义接口时,可以为接口中的属性或方法定义泛型类型,在使用接口时,在指定具体的泛型类型。
接下来看一下泛型接口在函数中如何使用,代码示例如下:
interface ICreate{
<T>(name:string,age:T):string
}
let func:ICreate=function<T>(name:string,age:T):string{
return name+","+age
}
func<number>("李四",20);//结果:李四,20
创建一个ICreate接口,里面定义了一个泛型函数的约束,<T>表示声明函数时必须是泛型格式,(name:string,age:T)表示声明函数时必须有name和age两个参数,两个参数的类型分别为string和泛型T,声明变量func使用接口ICreate进行约束,赋值函数时必须按照接口的规范声明函数。使用func函数时<number>表示泛型T为number类型,这时参数age:T会映射为age:number,所以传入的值必须是number类型即“20”。
再来看一下泛型接口在类中如何使用,代码示例如下:
//泛型接口
interface IUser<T>{
name:string;
age:number;
getUserInfo:()=>T
}
//定义一个用户类
class User implements IUser<string>{
public name:string;
public age:number;
constructor(name:string,age:number){
this.name=name;
this.age=age;
}
getUserInfo(){
return `姓名${this.name},年龄${this.age}`;
}
}
let user=new User("张三",30);
console.log(user.getUserInfo());//结果:姓名张三,年龄30
首先定义一个泛型接口IUser<T>,<T>表示类继承接口时传入的类型,T可以想象成接口的参数,可以在接口的属性或方法中使用,可以看到该接口内部的方法getUserInfo约束的类型是一个方法并且返回值的类型为泛型T。接下来在User类中继承IUser接口并传入指定类型<string>,表示getUserInfo方法返回的值必须是string类型。
精品好课