开启掘金成长之旅!这是我参与「掘金日新计划 · 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