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

TypeScript如何自动提取含generated属性的对象键?

解决方案:提取STATS对象中含generated属性的键

问题原因

  1. 直接索引报错是因为TypeScript无法确定STATS的所有键对应的属性都包含generated,所以不允许用'generated'直接索引整个类型;
  2. 给对象加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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 19:45:21