TypeScript 中的工具类型
Partial<T>
Partial 会创建一个新的类型同时它内部所有属性都变成可选的。
ts
interface User {
name: string;
age: number;
tel: string;
}
type PartialUser = Partial<User>
所得的 PartialUser 相当于
ts
interface User {
name?: string;
age?: number;
tel?: string;
}
日常可以用于更新对象属性,例如:
ts
const updateUser = (user: User, fields: Partial<User>): User => ({
...user,
...fields,
})
const user1: User = {
name: "张三",
age: 17,
tel: '123242323'
}
const user2 = updateUser(user1, { age: 18 })
Required<T>
Required 是 Partial 的反面,Required 创造一个新类型,同时内部所有的属性都是必须的。
ts
interface User {
name: string;
age: number;
tel: string;
}
type RequiredUser = Required<User>
Readonly<T>
Readonly 工具类型可以将给定类型的所有属性设为只读,这意味着给定类型的属性不可以被重新赋值
ts
interface User {
name: string;
age: number;
tel: string;
}
type ReadonlyUser = Readonly<User>
ReadonlyUser 相当于
ts
interface User {
readonly name: string;
readonly age: number;
readonly tel: string;
}
Pick<T, K>
Pick 的作用是从类型 T 中选择属性名为类型 K 中的属性,创建一个新类型。
ts
interface User {
name: string;
age: number;
tel: string;
}
type PickUser = Pick<User, 'name' | 'age'>
PickUser 的结果相当于
ts
interface User {
name: string;
age: number;
}
Omit<T, K>
与 Pick 类型相反,Omit 工具类型的功能是返回去除指定的键值之后的新类型
ts
interface User {
name: string;
age: number;
tel: string;
}
type OmitUser = Omit<User, 'name' | 'age'>
OmitUser 的结果相当于
ts
interface User {
tel: string;
}
Exclude<T, U>
从类型 T 中排除类型 U 中的所有属性
ts
interface User {
name: string;
age: number;
tel: string;
}
type ExcludeUser = Exclude<User, 'age'>
ExcludeUser 的结果相当于
ts
interface User {
name: string;
age: number;
}
Extract<T, U>
从类型 T 中提取类型 U 中存在的所有属性。
ts
type Intersect<T, U> = {
[K in Extract<keyof T, keyof U>]: T[K];
};
interface User {
name: string;
age: number;
tel: string;
}
interface NewUser {
name: string;
age: number;
}
type T = Intersect<User, NewUser>;
相当于
ts
type T = {
name: string;
age?: number;
}
Record<K, T>
Record 的作用创建一个类型,其中属性名为类型 K 中的值,属性值为类型 T 中的值。
ts
type MenuKey = 'home' | 'about' | 'more';
interface Menu {
label: string;
hidden?: boolean;
}
const menus: Record<MenuKey, Menu> = {
about: { label: '关于' },
home: { label: '主页' },
more: { label: '更多', hidden: true },
}
在某些特殊情况下我们可以这样用
ts
const condition: Record<string, any> = {}
if (schoolName) condition.schoolName = schoolName
if (schoolType) condition.schoolType = schoolType