【TS】一些常用的工具类型

Partial

为所有属性添加?这个midfier,也就是设置所有属性都是可选属性。

interface Person{
      name: string;
      age: number;
}

type NewPerson = Partial<Person>;
const p: NewPerson = {
      name: 'ashen';
};
// name和age都被设置成了可选属性

Required

设置所有属性都是必填的。

interface Person{
      name: string;
      age?: number;
}

type NewPerson = Required<Person>;
const p: NewPerson = {
      name: 'ashen'; // error age被设置成了必填属性
};

Record

设置给定的可能属性,都对应给定类型的“key:value”形式

type r = Record<'a'|'b'|'c', Person>;
// 最终实现 {a: Person; b: Person; c: Person}

Pick

将某个类型中的子属性挑选出来

type NewPerson = Pick<Person, 'name'>;
// NewPerson变成:{name: string}

Exclude

将某个类型中的子属性剔除

interface Animal{
      name: string;
      age: number;
      sex: string;
      sayHi: () => string;
      eat: string => void;
}

type Dog = Exclude<keyof Animal, 'sayHi'> // Dog类中包含除开sayHi的所有属性

当我们需要对interface进行继承时,如果像以下方式处理,会报错

      interface Chicken {
          name: string;
          age: number;
          egg: number;
      }
      interface NewChicken extends Chicken {
          name: number;
      }

此时我们需要将不被overwrite的属性提取出来,再进行继承

      interface NewChicken extends pick<Chicken, 'age'|'egg'>{
          name: number;
      }

但是如果需要提取的属性很多,难道要一个个列举出来吗?此时可以通过Exclude将name属性剔除,再传入Pick进行选择

      interface NewChicken extends pick<Chicken, Exclude<keyof Chicken, 'name'>>{
          name: number;
      }

Omit

就是以上Pick和Exclude的结合

Parameters

得到函数参数类型组成的元祖类型

type A = Parameters<typeof Array.isArray> // [any]
type B = Parameters<typeof parseInt> // [number, (string | undefined)?]

ReturnType

得到函数返回值的类型

function testFunc(){
      return 123;
}
type A = ReturnType<typeof testFunc>; // number
posted @ 2020-12-25 16:19  ashen1999  阅读(850)  评论(0编辑  收藏  举报