是指在定义函数、接口或类的时候,不预先指定具体的类型,而在使用的时候再指定类型的一种特性
泛型可以有多个参数:使用 T 后面的 U、V 等字母命名,各个参数之间使用逗号(“,”)分隔,如:fn<T, U>
函数写法
有些时候,函数返回值的类型与参数类型是相关的:
function fn<T>(arg: T): T {
return arg
}
let output = fn<string>("myString")
其中,使用 T 指代了输入的类型,在后面的输入和输出就可以使用 T 了
interface 写法
interface A<T> {
a: T
}
let obj: A<string> = {a: 'str'}
type 写法
type Nullable<T> = T | undefined | null
class 写法
class A<T> {
value: T
}
泛型约束条件
内部使用泛型变量的时候,由于事先不知道它是哪种类型,所以不能随意的操作它的属性或方法
可以使用 extends
对泛型的参数进行约束,只允许传入包括指定成员的类型:
interface Lengthwise {
length: number
}
function loggingIdentity<Type extends Lengthwise>(arg: Type): Type {
console.log(arg.length) // Now we know it has a .length property, so no more error
return arg
}