Extract我自己的理解就是第二个参数能否可以对第一个参数进行约束,如果可以就会返回第一个参数的类型。
先看一下Extract的实现
当然也可以自己写一个
type Extract<T,U> = T extends U ? T :never;
再来看一下使用
class People {
constructor(public name:string,public age:number) {
}
}
class ChinesePeople extends People {
public phone!:string;
constructor(public name:string,public age:number) {
super(name,age);
}
}
// 定律:子类 extends 父类 成立 返回 T 类型 也就是我传入的chinesePeople
type extractType = Extract<ChinesePeople,People>; // chinesePeople
// 定律:如果 父类 extends 子类 不成立 返回 never 类型 因为父类继承子类本身不成立
// 如果人为的想要让 父类 extends 子类 成立 获取到 People 那么
// 就必须让父类与子类的 实例方法和属性一样多
type extractType2 = Extract<People,ChinesePeople>; // never
const chinesePeople:extractType = new ChinesePeople('芝士小邓',18);