TypeScript如何自动提取含generated属性的对象键?
解决方案:提取STATS对象中含generated属性的键
问题原因
- 直接索引报错是因为TypeScript无法确定
STATS的所有键对应的属性都包含generated,所以不允许用'generated'直接索引整个类型; - 给对象加
Stat接口注解后,TS会丢失对象字面量的具体键信息,将键类型宽泛推断为string,而非实际的键名联合类型。
可行实现方案
步骤1:用as const保留对象的精确类型
定义STATS时添加as const断言,让TypeScript保留所有键和值的字面量类型,避免类型被宽泛化:
const STATS = { kills: { value: 0 }, deaths: { value: 0 }, score: { value: 0, generated: true }, level: { value: 1, generated: true } } as const;
步骤2:定义条件类型工具筛选目标键
编写一个工具类型,遍历对象的所有键,仅保留对应值包含generated属性的键:
type ExtractKeysWithGenerated<T> = { [K in keyof T]: T[K] extends { generated: unknown } ? K : never; }[keyof T];
这里用{ generated: unknown }匹配任何包含generated属性的结构,不管属性值具体类型。
步骤3:获取目标键的联合类型
通过typeof STATS获取对象的精确类型,传入工具类型即可得到具体的键名联合类型:
type GeneratedStatKeys = ExtractKeysWithGenerated<typeof STATS>; // GeneratedStatKeys 的类型为 "score" | "level"
额外说明:若需约束对象值类型
如果需要用接口约束STATS中每个值的类型,不要直接给对象加接口注解,而是结合typeof和索引类型,既保留键的字面量类型,又约束值结构:
interface BaseStat { value: number; generated?: boolean; } const STATS: { [K in keyof typeof STATS]: BaseStat } = { kills: { value: 0 }, deaths: { value: 0 }, score: { value: 0, generated: true }, level: { value: 1, generated: true } } as const;
内容的提问来源于stack exchange,提问作者jablonka
相关产品推荐
相关产品推荐

