TS内置工具类之Partial、Required、Pick、Record、Readonly、Omit

TS项目开发中,或多或少会遇到一些TS类型与类型之间需转换之处,这时你会怎么做。强大TS类型系统贴心的为开发者提供了部分常用的内置全局工具类型。

我们一起来看看吧。GO GO GO

Partial

其构造一个将 Type 的所有属性设置为可选的类型。此工具将返回一个表示给定类型的所有子集的类型。

示例:

PerInfo类型包含两个属性name和age

ts 复制代码
interface PerInfo {
    name: string;
    age: number;
}

Partial 将PerInfo接口中的属性变为可选属性

ts 复制代码
type Person=Partial<PerInfo>

相当于定义了如下类型

ts 复制代码
type Person = {
    name?: string;
    age?: number;
}

Partial源码

ts 复制代码
type Partial<T> = { [P in keyof T]?: T[P] | undefined; }

Required

Partial 相反。Required把传入泛型Type的属性都变为必选项。

ts 复制代码
interface Props {
    a?: number;
    b?: string;
}

const obj: Props = { a: 5 };

const obj2: Required<Props> = { a: 5 };
// Property 'b' is missing in type '{ a: number; }' but required in type 'Required<Props>'.

Required源码

ts 复制代码
type Required<T> = { [P in keyof T]-?: T[P]; }

Pick

从泛型Type中获取指定属性的类型,相当于得到的新类型只包含你所指定的泛型第二个参数的属性的类型。

示例:

PerInfo类型包含两个属性name和age

ts 复制代码
interface PerInfo {
    name: string;
    age: number;
    sex: string;
}

Partial 将PerInfo接口中的属性变为可选属性

ts 复制代码
type Person=Pick<PerInfo,'name'|'age'>

相当于定义了如下类型

ts 复制代码
type Person = {
    name: string;
    age: number;
}

Pick源码

ts 复制代码
type Pick<T, K extends keyof T> = { [P in K]: T[P]; }

Record

构造一个对象类型,其属性键为 Keys,其属性值为 Type。可用于将一种类型的属性映射到另一种类型。

示例:

js 复制代码
interface CatInfo {
    age: number;
    breed: string;
}

type CatName = "miffy" | "boris" | "mordred";

type Cats = Record<CatName, CatInfo>

const cats: Record<CatName, CatInfo> = {
    miffy: { age: 10, breed: "Persian" },
    boris: { age: 5, breed: "Maine Coon" },
    mordred: { age: 16, breed: "British Shorthair" },
};

cats.boris;

Record源码

ts 复制代码
type Record<K extends string | number | symbol, T> = { [P in K]: T; }

Readonly

构造一个将 Type 的所有属性设置为 readonly 的类型,这意味着构造类型的属性不能重新分配。

示例:

Omit

通过从 Type 中选择所有属性然后删除 Keys(字符串字面或字符串字面的并集)来构造一个类型。与 Pick 相反。

示例:

ts 复制代码
// 定义User类型
interface User {
    name: string;
    age: number;
    email: string;
    isActive: boolean;
    creditCardDetails: number;
}

Omit构造不包含 creditCardDetails 属性的新类型 LiUser

ts 复制代码
type LiUser = Omit<User, "creditCardDetails">;

Omit构造不包含多个属性 的新类型 TiUser

ts 复制代码
type TiUser = Omit<User, "email" | "isActive">;

Omit源码

ts 复制代码
type Omit<T, K extends string | number | symbol> = { [P in Exclude<keyof T, K>]: T[P]; }

未完待续......

相关推荐
橙子家2 分钟前
Extension storage、Interest groups 和 Shared storage 简介-浏览器缓存之【隐私沙盒与扩展专用存储】
前端
漂流瓶jz33 分钟前
理解Webpack插件机制:从插件使用、各类编译对象、Tapable到自定义插件与钩子开发
前端·javascript·webpack
梦帮科技11 小时前
GRAVIS v4.0:基于Web的极速套利架构设计与实时数据流实现
前端·人工智能·rust·自动化·区块链·智能合约·数字货币
爱勇宝11 小时前
办公资料反复修改、补传、交接混乱,我做了个桌面工具来解决这件事
前端·后端·程序员
微信开发api-视频号协议12 小时前
企业微信外部群开发自动化实践过程
java·前端·微信·自动化·企业微信·ipad
甲维斯12 小时前
Fable5:20美金的顶级设计师!
前端·人工智能
kyriewen12 小时前
我同时用了 Claude Code、Cursor 和 Codex,说说三个工具的真实差距——2026 年选错工具比不用 AI 更浪费时间
前端·ai编程·claude
Jackson__13 小时前
为了拯救我的腰椎和颈椎,我做了款浏览器插件!
前端·javascript·开源
闲猫13 小时前
Python FastAPI + SQLAlchemy 入门教程:从零搭建你的第一个 Web 应用
前端·python·fastapi
林小帅13 小时前
NestJS v11 + Prisma v7 ESM 迁移配置解析
前端·javascript·后端