Ts的Extract高级类型初探

188 阅读1分钟

Extract我自己的理解就是第二个参数能否可以对第一个参数进行约束,如果可以就会返回第一个参数的类型。

先看一下Extract的实现 image.png

当然也可以自己写一个

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);