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);正常运行,类型为1console.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
相关产品推荐
相关产品推荐

