常用的工具泛型

138 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第6天,点击查看活动详情 常用的工具泛型

1、Partial :把当前类型中的属性变为可选项

interface Student{
  name:string,
  age:number,
  class:string
}


function ownStudent<T extends Student>(args: Partial<T>): Partical<T>{
  return arg
}

2、Record: 把类型T中的属性转换为类型K


interface TitleType{
  title: string
}

interface OriginalType {
  country: string,
  province: string,
  city: string
}

const Result:Record<OriginalType,TitleType> = {
  country:{title:"xxx"}
  province: "杭州",
  city: "萧山"
}

3、Exclude: 删除类型中的属于另一个类型的属性

interface  Person {
  name:string,
  age:number,
  phoneNumber: number
}

type Student = Exclude<Person,"phoneNumber">

const S1:student = {
  name:"flank",
  age: 18
}

4、Pick: 将某个类型中的部分属性挑出来,变成包含该类型部分属性的子类型

interface Student {
  name:string,
  age:number,
  grade: number, 
  duty: string,
  class: string
}

type Monitor = Pick<Student,"grade" | "class" | duty>

const monitor:Monitor = {
  grade: 4,
  duty: "monitor",
  class: "3班" 
}

5、ReturnType : 获取函数T的返回类型

type T0 = ReturnType<() => void)>

6、keyof: 返回一个指定对象类型的键名组成的联合类型

type User = {
  name:string,
  age: number
}

type UserKey = keyof User; // 'name' | 'age'

如果keyof操作的是联合类型,则返回联合类型的公共key

type User = {
  name:string;
  age:number
};
type Student = {
  name: string;
  grade: number;
};
type Doctor = {
   hospital:string
}

type A = keyof (User | Foo);   // 'name'
type B = keyof (User | Doctor); // never

如果想要返回联合类型的所有key,应该怎么操作呢?

type UnionKeys<T> = T extends T ? keyof T : never
type keys = UnionKeys<User | Foo | Bar>; // 'name' | 'age' | 'foo' | 'bar'

7、typeof:可以推断javascript对象的类型,返回更详细的对象类型。

const user = { name: 'string',age:20 };
type UserType = typeof user; // { name:string;age:number }
type UserKey = keyof typeof user  // 'name' | 'age'

8、extends

条件判断 A extends B: 若是A的每一个类型都可以赋值给B,则为 true,反之为 false。 可以这么理解,表达式为 true时,说明当一个类型是A类型时,则一定可以是B类型。但反过来,如果一个类型是B类型,不一定是A类型。也即A应该是子类,B是父类(子类的限制比父类的多,所以,当其满足子类的限制时,一定满足父类的限制)。如 Animal 和 Dog。当一个 xiaohuang 是 Dog 类型时,一定是 Animal。

type User = {
  name: string;
  age: number;
};

type Student = {
  name: string;
  age: number;
  grade: number;
};

type T = Student extends User ? string : number; // string
type P = User extends Student ? string : number; // number