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

如何将接口类型判别符作为字符串联合约束对象键名?

实现基于联合类型判别符的对象键约束

要实现你需要的功能,核心是先从联合类型中提取出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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 13:05:19