如何将接口类型判别符作为字符串联合约束对象键名?
实现基于联合类型判别符的对象键约束
要实现你需要的功能,核心是先从联合类型中提取出type判别符的集合,再用这个集合作为对象的键类型,具体步骤如下:
1. 提取联合类型的判别符类型
先定义一个工具类型,用来从带type属性的联合类型中提取所有判别符的字面量类型:
type ExtractDiscriminator<T> = T extends { type: infer U } ? U : never;
这个工具类型通过条件类型的infer关键字,自动推导联合类型中每个成员的type属性值,最终得到所有判别符的联合类型。
针对你的示例,使用这个工具类型提取ABBA的判别符:
type ABBA = A | B; interface A { type: 'a', argForA: string } interface B { type: 'b', argForB: boolean } // 得到类型 'a' | 'b' type ABBADiscriminators = ExtractDiscriminator<ABBA>;
2. 约束对象的键为判别符集合
用提取到的判别符类型作为Record的键类型,就能限制对象的键只能是合法的判别符:
const config: Record<ABBADiscriminators, number> = { a: 123, b: 234, c: 345, // 这里会报错,因为'c'不在 'a' | 'b' 中 };
简化写法(合并成一个类型)
如果不想单独定义判别符类型,也可以直接把工具类型嵌入Record中:
const config: Record<ExtractDiscriminator<ABBA>, number> = { a: 123, b: 234, // c: 345, // 同样会报错 };
这样就实现了你需要的「反向Record」效果——不再是指定键类型生成对象,而是从现有联合类型的判别符中推导合法键类型,精准约束对象的键范围。
内容的提问来源于stack exchange,提问作者stef
相关产品推荐
相关产品推荐

