You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TypeScript中如何将对象类型的键限制为联合类型的子集?

解决方案

要实现仅包含联合类型中指定键的对象,同时满足const断言的需求,你可以通过以下几种方式处理:

方法1:提取目标子联合类型

先从原联合类型中筛选出需要的键,再基于这个子联合类型创建映射对象:

type Union = 'A' | 'B' | 'C';
// 从Union中提取'A'和'B',得到新的联合类型
type SelectedKeys = Extract<Union, 'A' | 'B'>;

// 基于子联合类型定义对象类型,并用const断言
const myObject: { [K in SelectedKeys]: number } = {
  A: 1,
  B: 2,
} as const;

方法2:直接在映射类型中提取

如果不想单独定义子联合类型,可以直接在映射类型里使用Extract:

type Union = 'A' | 'B' | 'C';

const myObject: { [K in Extract<Union, 'A' | 'B'>]: number } = {
  A: 1,
  B: 2,
} as const;

方法3:使用Pick工具类型

利用Pick工具类型从完整的联合类型对象中挑选指定键:

type Union = 'A' | 'B' | 'C';

const myObject: Pick<Record<Union, number>, 'A' | 'B'> = {
  A: 1,
  B: 2,
} as const;

效果验证

上述三种写法都能满足你的需求:

  • console.log(myObject.A); 正常运行,类型为1
  • console.log(myObject.C); 编译器报错,提示“属性'C'不存在于类型'{ readonly A: 1; readonly B: 2; }'”

原写法报错原因

你之前使用{ [K in Union]: number }会生成包含A/B/C三个必填键的类型,而你的对象只提供了A和B,因此触发“缺少属性C”的错误。通过Extract或Pick筛选出目标键后,类型仅要求包含指定的键,不会强制要求原联合类型的所有键。

内容的提问来源于stack exchange,提问作者jayatubi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 09:18:18