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

TypeScript:如何从静态类实例提取属性值生成联合类型?

问题:如何通过keyof操作符提取静态类中Market实例的name属性生成联合类型?

我定义了一个仅包含name参数的Market类:

class Market {
  name: string

  constructor(name: string) {
    this.name = name
  }
}

随后创建了包含多个Market静态实例的Markets类:

class Markets {
  static M1 = new Market("M1M")
  static M2 = new Market("M2M")
  static M3 = new Market("M3M")
}

我希望提取所有Market实例的name属性值,生成类似如下的联合类型:

type MarketNames = "M1M" | "M2M" | "M3M"

我了解keyof操作符,想知道是否可以通过它实现这一需求?


回答

当然可以通过keyof结合类型查询实现,具体逻辑如下:

  1. 用keyof typeof Markets获取Markets类的所有静态属性键,得到"M1" | "M2" | "M3"联合类型;
  2. 通过typeof Markets[keyof typeof Markets]获取每个静态属性对应的Market实例类型;
  3. 访问实例的name属性,提取出所有name的字面量类型并整合成目标联合类型。

完整的类型定义代码如下:

type MarketNames = typeof Markets[keyof typeof Markets]["name"];

这样定义后,MarketNames会被TypeScript自动推断为"M1M" | "M2M" | "M3M",完全符合需求。

需要注意:TypeScript能正确推断name的字面量类型,前提是创建Market实例时传入的是字符串字面量。如果传入的是变量,需要用as const保留字面量类型,示例:

const m1Name = "M1M" as const;
static M1 = new Market(m1Name);

内容的提问来源于stack exchange,提问作者Riccardo Perego

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 08:45:49