泛型,就是可以使用多个类型,此时使用类型变量可以捕获传入的类型,泛型的本质就是参数化类型,就是指所操作的数据类型被指定成为一个变量(参数)
注意:参数化可以用在类,接口和函数的创建中,分别为泛型类,泛型接口,泛型函数(这个函数的参数类型或者返回值的类型可变)
泛型函数
语法1:
function 函数名<类型变量..>(参数:参数类型):返回值类型{return }
注意:类型变量相当于一个类型容器,能够捕获用户提供的类型
语法2:
const 函数名=<类型变量>(value:类型变量):类型变量=>{return value}
类型推断简化函数调用
在调用泛型函数时,可以省略 <类型> 来简化泛型函数的调用,此时,TS 内部会采用一种叫做类型参数推断的机制,来根据传入的实参自动推断出类型变量 Type 的类型
示例:
const useState=<T>(value:T):[value:T,(newValue:T)=>void]=>{
type zg=(m:T)=>void
const Obj=()=>{}
return [value,Obj]
}
泛型约束
场景:在默认情况下,泛型函数的类型变量可以代表多个类型,这就导致无法访问泛型函数中的任何属性,此时就需要添加约束来收缩类型(缩小类型的取值范围),从而获得代码类型提示
添加泛型约束
添加泛型约束收缩类型,主要有以下两种方式:
- 指定更加具体的类型
- 添加约束
泛型接口
作用:在接口中使用泛型来使用,以增加其灵活性,增强其复用性
语法:
interface 接口名<类型变量1,类型变量2...> {
属性名1:类型1,
属性名2:类型2,
属性名3:类型3
}
注意:
- 在接口名称的后面添加
<类型变量>,那么,这个接口就变成了泛型接口。 - 接口的类型变量,对接口中所有其他成员可见,也就是接口中所有成员都可以使用类型变量。
- 使用泛型接口时,需要显式指定具体的类型
示例:
interface Array{
length:number,
push(n:number):void,
pop():number,
reverse():number[]
}
let Obj:Array={
id(val){return val},
ids(){return [1,2,3]}
}
泛型工具
泛型工具类型:TS 内置了一些常用的工具类型,用来简化TS的某些操作
Partial
Partial用来基于某个Type来创建一个新类型,新类型中所有的属性是可选的。
语法:
type OldType = { 属性1:类型1,....}
type NewType = Partial<OldType>
注意:构造出来的新类型结构与初始结构相同,但是新类型的所有属性都变为可选的
Readonly
作用:用来构造一个类型,并将所有类型的所有属性都设置为可读(不能修改)
Pick
作用:从已有的类型中挑选一组属性,来构造新类型。
语法:
Pick<老类型, 挑选的属性>
注意:Pick有两个类型变量(变量1:表示选择谁的属性,变量2:表示选择哪几个属性),且变量2传入的值只能是变量1的属性