是指在定义【function、interface、type、class】的时候,不预先指定具体的类型,而在使用的时候再指定类型的一种特性
泛型可以有多个参数:一般使用 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 | nullclass 写法
class A<T> {
value: T
}类型参数的默认值
类型参数可以设置默认值。使用时,如果没有给出类型参数的值,就会使用默认值。
function getFirst<T = string>(
arr: T[]
): T {
return arr[0]
}
getFirst([1, 2, 3]) // 正确泛型约束条件
内部使用泛型变量的时候,由于事先不知道它是哪种类型,所以不能随意的操作它的属性或方法
可以使用 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
}