Skip to content

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