Type-fest 用于 TypeScript:完整指南及示例

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

什么是 Type-fest,为什么需要它?



Type-fest 是一个由 Sindre Sorhus 社区创建的 TypeScript 实用类型集合。这个库提供了数十种现成的类型,用于解决 TypeScript 开发中的日常任务:从简单的转换(例如,使对象的所有字段变为可选)到复杂的条件类型(例如,从 Promise 中提取值的类型)。



为什么需要这个库?TypeScript 是一种强大的语言,但其内置类型(Partial、Required、Pick、Record)仅涵盖基本场景。在实际项目中,通常需要更具体的结构:深层对象合并、用于处理 JSON 的类型、常量的严格类型化、从复杂结构中提取类型等。Type-fest 免去了手动编写这些类型的需要,节省了时间并降低了出错的可能性。



该库得到积极维护,在 GitHub 上拥有超过 10,000 颗星,并用于 Next.js、Vite 和 Expo 等大型项目中。



安装



Type-fest 是一个 npm 包,作为开发依赖项安装(因为类型不影响运行时)。



# npmnpm install --save-dev type-fest

# yarnyarn add --dev type-fest

# pnpmpnpm add --save-dev type-fest


请注意:该库不能通过 pip 安装——它仅适用于 TypeScript/JavaScript。



快速入门



安装后,您可以从库中导入任何类型。让我们看一个最简单的例子——使用 PartialDeep 类型,它使对象的所有字段(包括嵌套字段)变为可选。



import type { PartialDeep } from 'type-fest';

interface User { id: number; name: string; address: { city: string; zip: number; };}

// 普通的 Partial 仅使第一层字段变为可选type PartialUser = Partial<User>;// { id?: number; name?: string; address?: { city: string; zip: number; } }

// PartialDeep 使所有嵌套字段变为可选type DeepPartialUser = PartialDeep<User>;// { id?: number; name?: string; address?: { city?: string; zip?: number; } }

const user: DeepPartialUser = { name: 'Alice', address: { city: 'Wonderland' // zip 可以不指定 }};


如您所见,PartialDeep 自动遍历所有嵌套层级——这正是您需要使用递归类型手动编写的内容。



主要方法/类型



让我们看看 Type-fest 中 10 个最有用的类型。每个类型都提供了描述、参数(如果有)和一个可运行的示例。



1. PartialDeep

功能: 使对象的所有属性(包括嵌套属性)变为可选。递归遍历所有层级。

参数: 一个必需参数——对象类型。

import type { PartialDeep } from 'type-fest';

interface Config { server: { host: string; port: number; }; debug: boolean;}

type PartialConfig = PartialDeep<Config>;// {// server?: {// host?: string;// port?: number;// };// debug?: boolean;// }

const config: PartialConfig = { server: { host: 'localhost' // port 未指定——没有错误 }};


2. RequiredDeep

功能: 使对象的所有属性(包括嵌套属性)变为必需。与 PartialDeep 相反。

参数: 对象类型。

import type { RequiredDeep } from 'type-fest';

interface User { name?: string; address?: { city?: string; };}

type StrictUser = RequiredDeep<User>;// {// name: string;// address

推荐