声明
< T, V > // 声明
< number, string > // 使用
- 通过
<>
声明泛型变量,名称随意(一般是大写字母),可以声明多个,变量使用方式与类型相同 - 变量代表一种不确定的类型,使用时需要传入一个类型,指定变量代表的类型
- 使用时如果不传类型,TS会根据值自动推算类型
使用
泛型函数类型
type Func = <T>( params: T ) => T
const func: Func = ( params ) => params
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属性的类型