介绍

泛型(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]