required可将接口中所有可选属性变为必填项,仅作用于第一层,不递归处理嵌套对象;需深层强制必填时应使用自定义deeprequired类型。

直接用 Required<t></t> 包裹原类型,就能把所有带 ? 的可选属性立刻变成必填项,不改类型、不删字段,只统一“去可选性”。
核心用法:一行代码搞定
比如有这个接口:
interface User {
id: number;
name: string;
email?: string;
avatar?: string;
}
写 Required<user></user> 后,email 和 avatar 就必须提供,否则 TypeScript 编译报错:
-
const u1: Required<user> = { id: 1, name: 'A' };</user>→ 报错(缺email和avatar) -
const u2: Required<user> = { id: 1, name: 'A', email: 'a@b.c', avatar: '/img' };</user>→ 合法
它只处理第一层,嵌套对象不受影响
如果类型里有深层可选字段,Required 不会递归处理。例如:
使用 Vite 8、React 19、Tailwind CSS v4、shadcn/ui、Biome、Vitest 和 Hono 构建全栈 TypeScript 应用,涵盖前端(Vite/Rolldown 构建 + 开发)...
interface Profile {
name: string;
contact?: {
phone?: string;
email?: string;
};
}
-
Required<profile></profile>只让contact变成必填,但contact.phone和contact.email仍可选 - 要彻底强制所有层级都必填,得手写递归类型:
DeepRequired
和手动组合 Pick + -? 没必要
有人想用 Pick<t keyof t></t> 再加修饰符,其实多此一举。因为 Required 就是专为这个场景设计的官方工具:
- 语义明确:一看就知道“全都要”
- 维护可靠:TypeScript 内置,不用自己维护边界情况
- 写法简洁:
Required<user></user>比一堆映射逻辑更直观
常见适用场景
数据校验阶段:比如表单提交前、API 请求体组装时,确保所有字段已填写。
配置对象初始化:定义默认配置后,用 Required 约束用户传入的完整配置。
类型收窄过渡:从宽松接口(如 API 响应类型)派生出强约束版本,用于关键业务逻辑。










