声明

  1. < T, V > // 声明
  2. < number, string > // 使用
  • 通过 <> 声明泛型变量,名称随意(一般是大写字母),可以声明多个,变量使用方式与类型相同
  • 变量代表一种不确定的类型,使用时需要传入一个类型,指定变量代表的类型
  • 使用时如果不传类型,TS会根据值自动推算类型

使用

泛型函数类型

  1. type Func = <T>( params: T ) => T
  2. const func: Func = ( params ) => params
  3. func<number>(123)

泛型类类型

class What<T> {
    public list: T[] = []
  add(value: T): T {
    this.list.push(value)
    return value
  }
}

const what = new What<number>()
  • 类的泛型需要在实例化时指定类型

泛型接口类型

方式一

interface Func {           // 方式一
    <T>(params: T): T
}

const func: Func = params => params 

func<string>('哈哈')        // 调用时
  • 只能在的那个函数中使用的泛型变量,在函数调用时传入类型

方式二

interface Func<T> {            // 方式二
    (params: T): T,
  array: T[]
}

const func: Func<string> = ...  // 类型定义时
  • 接口中所有内容都能使用的泛型变量,在类型定义时传入类型
  • 该方式适用于所有接口类型

泛型约束

泛型变量默认可以接收任意类型,也可以增加约束,只接收某些类型

< T extends type >
  • 泛型变量声明时,可以通过 extends 继承某个类型
  • 继承后该变量会拥有父类型的特性,因此指定类型时需要符合特性,达到约束的效果

    interface Type {
      length: number 
    }
    const func = <T extends Type>( params: T ): T => params 
    func<string>('123456')
    
  • 此时 T 只能接受含有length属性的类型