什么是 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