如何从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
相关产品推荐
相关产品推荐

