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结合类型查询实现,具体逻辑如下:
- 用
keyof typeof Markets获取Markets类的所有静态属性键,得到"M1" | "M2" | "M3"联合类型; - 通过
typeof Markets[keyof typeof Markets]获取每个静态属性对应的Market实例类型; - 访问实例的
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
相关产品推荐
相关产品推荐

