是指在定义函数、接口或类的时候,不预先指定具体的类型,而在使用的时候再指定类型的一种特性

泛型可以有多个参数:使用 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
}

类型参数的默认值

类型参数可以设置默认值。使用时,如果没有给出类型参数的值,就会使用默认值。

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
}