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

如何从TypeScript对象值自动推导联合类型以避免重复定义?

如何从TypeScript对象值自动推导联合类型以避免重复定义?

当然有办法实现,完全不用重复写那些字符串值!我来给你一步步讲清楚怎么做:

首先,你已经用了as const断言来让TypeScript把ANNOTATION_KEYS的每个值都识别成字面量类型(而不是宽泛的string类型),这是关键的第一步。接下来只需要结合typeof和索引类型就能自动生成你要的联合类型了:

const ANNOTATION_KEYS = { 
  SERVICE: 'website.com/service-name',
  GITHUB: 'website.com/service-repo-url',
  JIRA: 'website.com/service-jira-url'
} as const;

// 自动生成的联合类型
type AnnotationKey = typeof ANNOTATION_KEYS[keyof typeof ANNOTATION_KEYS];

这样AnnotationKey就完全等价于你手动写的"website.com/service-name" | "website.com/service-repo-url" | "website.com/service-jira-url",而且以后你修改ANNOTATION_KEYS里的值或者新增键,AnnotationKey会自动同步更新,完美解决重复维护的问题!

原理拆解一下:

  • typeof ANNOTATION_KEYS:获取这个常量对象的类型,TypeScript会把它解析成一个包含所有键和对应字面量值的对象类型
  • keyof typeof ANNOTATION_KEYS:提取这个对象类型的所有键,得到联合类型'SERVICE' | 'GITHUB' | 'JIRA'
  • 最后用这个键的联合类型去索引对象类型,就得到了所有值的联合类型,也就是你想要的结果

验证一下效果:

你可以写个测试函数来确认类型是否正常工作:

function useAnnotation(key: AnnotationKey) {
  console.log(key);
}

// 正常通过类型检查
useAnnotation(ANNOTATION_KEYS.SERVICE);
useAnnotation(ANNOTATION_KEYS.GITHUB);

// 如果传入不在对象里的字符串,TypeScript会报错
useAnnotation('random-string'); // 类型错误,符合预期

要是你没加as const,TypeScript会把对象里的值都推断成string,那生成的AnnotationKey就会变成宽泛的string类型,达不到你要的精确约束效果,所以as const一定不能少哦。

备注:内容来源于stack exchange,提问作者PapaGing99

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 10:24:29