首先是泛型,泛型理解为传递给函数的一种“类型”参数
interface Map<T,P> = (T) => P然后是extends关键字,他不是面向对象编程中的继承extends关键字,而是一种后者是否是前者的“超集”的含义
interface Animal {
name:string
}
interface Dog extends Animal {
color:string
}这里的Dog是Animal的超集,Animal中的所有属性Dog都有,除了Animal的属性,还添加了color属性,除了这些,还可以作为表达式使用
type feature ={
color:string
}
interface Animal<T> = T extends feature ? Dog : never如果传递过来的T是feature的超集,那么就会推断Animal为Dog类型,否则是never类型
结合infer关键字,可以结合出强大的类型操作,infer顾名思义就是推断,推断是不是这个类型
interface A<T> = T extends Array<infer B> ? B : never这里的代码就是推断传递过来的T是否是元素包含B的数组,如果是,那么A的类型为B,否则为never
还有 in keyof [as ..] 关键字,in keyof用于遍历一个类型的所有属性的键,后面的as 部分是给这个键来起别名的
interface A<T> {
[P in keyof T]
}
A这个类型会遍历传递过来的T的所有属性键,并添加到自己的属性当中,并且还可以用as来为这些属性键依次起别名
reference
https://www.youtube.com/watch?v=bnTAOB3P6nM&t=807s https://www.youtube.com/watch?v=EcCTIExsqmI