
本文介绍如何使用 TypeScript 内置工具类型 Exclude 或 Extract,从 Record 的键类型中精准剔除或保留特定键,实现类型安全且非全可选的映射对象定义。
本文介绍如何使用 typescript 内置工具类型 `exclude` 或 `extract`,从 `record
在使用 OpenAPI 自动生成的常量枚举(如 as const 对象)时,常需基于其值构建 Record 类型映射。但直接使用完整联合类型作为键会导致 TypeScript 强制要求所有键都必须存在——即使你只希望覆盖其中一部分。
例如,给定如下常量与类型:
export const MyConst = {
A: 'a',
B: 'b',
C: 'c',
} as const;
export type MyConst = (typeof MyConst)[keyof typeof MyConst]; // 'a' | 'b' | 'c'
若声明 Record
✅ 正确解法是缩小键类型范围,而非放宽值约束。TypeScript 提供了两个核心工具类型:
- Exclude
:从联合类型 T 中剔除属于 U 的成员; - Extract
:从 T 中提取与 U 兼容的成员(即交集)。
二者在此场景下等价,推荐优先使用 Exclude,语义更清晰:
// ✅ 排除 'c',仅保留 'a' | 'b'
const mapper: Record<exclude typeof myconst.c>, string> = {
[MyConst.A]: 'Test A',
[MyConst.B]: 'Test B',
// [MyConst.C]: 'Test C', // ❌ 编译错误:不允许出现 C
};
// ✅ 或显式提取所需键(等效)
const mapper2: Record<extract>, string> = {
[MyConst.A]: 'Test A',
[MyConst.B]: 'Test B',
};</extract></exclude>
⚠️ 注意事项:
- Exclude
是合法的,但 typeof MyConst.C 更具可维护性(避免魔法字符串); - 不要尝试 Omit
, 'c'> —— Omit 作用于对象类型,而 Record 的键是类型参数,不是对象属性,因此 Omit 无效; - 若需动态排除多个键,可组合使用:Exclude
; - 所有键仍为必需(非可选),未声明的键(如 C)无法被赋值,已声明的键(如 A、B)缺失会触发编译错误,完美满足“部分键必需 + 其他键禁止”的需求。
总结:当需要对 Record 的键做子集约束时,应操作其泛型参数 K,而非包裹 Partial 或误用 Omit。Exclude











