源本科技 | 码上会

TypeScript 泛型工具类型

2026/04/14
4
0

引言

泛型工具类型是 TypeScript 内置的预定义泛型类型,专门用于类型操作与类型转换。借助这些工具类型,无需重复编写复杂类型逻辑,即可快速处理属性修改、类型筛选、对象结构定义等场景,大幅提升类型代码的简洁性和可维护性。

Partial

Partial<T>:创建一个新类型,将类型 T 中的所有属性转换为可选属性常用场景:对象更新、表单编辑、部分属性赋值。

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

// 将 User 的所有属性变为可选
type PartialUser = Partial<User>; 
// 等价于:{ name?: string; age?: number; }

// 赋值时可只传部分属性
const user: PartialUser = { name: "John" };

Required

Required<T>:与 Partial 相反,创建一个新类型,将类型 T 中的所有属性转换为必选属性

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

// 将所有可选属性变为必选
type RequiredUser = Required<User>;
// 等价于:{ name: string; age: number; }

Readonly

Readonly<T>:创建一个新类型,将类型 T 中的所有属性转换为只读属性,赋值后无法修改。 常用场景:常量配置、不可变数据。

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

// 将所有属性变为只读
type ReadonlyUser = Readonly<User>; 
// 等价于:{ readonly name: string; readonly age: number; }

const user: ReadonlyUser = { name: "John", age: 20 };
// user.age = 21; // 报错:只读属性无法修改

Pick

Pick<T, K>:从类型 T选取指定的属性集合 K,创建一个新类型。 常用场景:从复杂类型中提取需要的部分属性。

interface User {
  name: string;
  age: number;
  email: string;
}

// 从 User 中选取 name 和 email 两个属性
type UserProfile = Pick<User, 'name' | 'email'>;
// 等价于:{ name: string; email: string; }

const user: UserProfile = {
  name: 'John Doe',
  email: 'john@example.com',
};

Omit

Omit<T, K>:与 Pick 相反,从类型 T剔除指定的属性集合 K,保留剩余属性。

interface User {
  name: string;
  age: number;
  email: string;
}

// 剔除 age 属性,保留剩余属性
type UserWithoutAge = Omit<User, 'age'>;
// 等价于:{ name: string; email: string; }

Exclude

Exclude<T, U>:从联合类型 T 中,排除所有可以赋值给 U 的类型,保留剩余类型。

type T = 'a' | 'b' | 'c';
type U = 'a' | 'd';

// 排除类型 a,保留 b、c
type ExcludeType = Exclude<T, U>; // 'b' | 'c'

Extract

Extract<T, U>:从联合类型 T 中,提取所有可以赋值给 U 的类型,与 Exclude 互为相反操作。

type T = 'a' | 'b' | 'c';
type U = 'a' | 'd';

// 提取公共类型 a
type ExtractType = Extract<T, U>; // 'a'

Record

Record<K, T>:快速定义一个键值对对象类型K 为属性名类型,T 为属性值类型。 常用场景:定义字典、映射表、对象集合。

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

// 定义键为字符串、值为 User 类型的对象
type UserRecord = Record<string, User>; 
// 等价于:{ [key: string]: User; }

const userRecord: UserRecord = {
  user1: { name: "镜流", age: 18 },
  user2: { name: "刃", age: 20 },
};

ReturnType

ReturnType<T>:提取函数类型 T返回值类型

const getUser = () => {
  return { name: "John", age: 20 };
};

// 获取函数的返回值类型
type UserReturnType = ReturnType<typeof getUser>;
// 等价于:{ name: string; age: number; }

Parameters

Parameters<T>:提取函数类型 T参数类型,返回一个元组类型。

const add = (a: number, b: string) => `${a}${b}`;

// 获取函数的参数类型元组
type AddParams = Parameters<typeof add>; // [number, string]

总结

  1. 属性操作类Partial(可选)、Required(必选)、Readonly(只读)、Pick(选取)、Omit(剔除);

  2. 类型筛选类Exclude(排除)、Extract(提取);

  3. 结构定义类Record(键值对)、ReturnType(返回值)、Parameters(参数);

  4. 核心价值:内置工具类型封装了通用类型逻辑,是 TypeScript 工程化开发中简化类型定义的必备工具。