泛型(Generics)是指在定义函数、接口或类的时候,不预先指定具体的类型,而在使用的时候再指定类型的一种特性。
//应用场景 定义一个方法,返回传入的参数
function echo(arg){
return arg
}
//如果此时不定义参数的类型,那么参数arg的类型为any,丧失了typescript的意义,但如果定义特定类型,那么只能传入指定类型的值
const str = echo('str') //any
const num = echo(123) //any
此时,可以使用泛型,用表示
function echo<T>(arg:T):T{
return arg
}
//指定泛型类型
const str:string = echo('str') //string
const num:number = echo(123) //123
//也可以根据类型推论
const boo = echo(true) //true
泛型也可以指定多个参数类型
//返回翻转传入参数的函数
function swap<T,U>(value[T,U]):[U,T]{
return [value[1],value[0]]
}
let res = swap([123,'123']) // 此时T为number,U为string
res[0] //string
res[1] //number
用接口来约束泛型
interface IwithLength {
length: number
}
function echoWitchLength<T extends IwithLength>(arg:T):T {
console.log(arg.length)
return arg
}
//此时 只要有length的属性或者方法,都可以返回
const str1 = echoWithLenght('123')
const arr1 = echoWithLenght([1, 2, 3])
const obj1 = echoWithLenght({ name: '123', length: 20 })
泛型和类
class Queue<T> {
private data = []
push(item:T){
return this.data.push(item)
}
pop():T{
return this.data.shift()
}
}
const quque = new Queue<number>() //约束类中的泛型为number
queue.push(1)
console.log(queue.pop().toFixed())
queue.push('str') //此时就会报错,不能push string类型
//如果不使用泛型约束,那么queue.pop().toFixed()编译的时候不会报错,但代码运行的时候会报错,因为string没有toFixed方法,但是不使用泛型那么数据类型是any
泛型和接口
interface IKeyPair<T, U> {
key: T
value: U
}
//动态传入数据类型
let kp1: IKeyPair<number, string> = { key: 123, value: 'string' }
let kp2: IKeyPair<boolean,object> = {key:true,value:{good:'123'}}
let arrTwo:Array<number> = [1,2,3]