如何从TypeScript类属性值生成对应联合类型
解决方案
你遇到的问题根源是:显式给类属性标注string类型后,TypeScript会自动将初始的字面量值拓宽为通用的string类型,导致X[keyof X]无法得到具体的字面量联合类型。以下是几种可行的解决方法:
方法一:去掉属性的显式类型标注
让TypeScript自动推断属性的字面量类型,无需额外操作:
class X { S1 = "Hello" S2 = "World" } type V = X[keyof X] // 类型为 "Hello" | "World"
方法二:用as const断言保留字面量类型
如果需要保留string类型标注,可以通过as const强制锁定字面量值的类型:
class X { S1: string = "Hello" as const S2: string = "World" as const } // as const会让属性变为只读,因此用Readonly包裹类类型 type XReadonly = Readonly<X> type V = XReadonly[keyof XReadonly] // 类型为 "Hello" | "World"
方法三:基于实例推导类型(不修改类定义)
如果不想改动原类的代码,可以创建实例并通过as const断言锁定值类型,再从实例类型中推导:
class X { S1: string = "Hello" S2: string = "World" } const xInstance = new X() as const type V = typeof xInstance[keyof typeof xInstance] // 类型为 "Hello" | "World"
内容的提问来源于stack exchange,提问作者redsun
相关产品推荐
相关产品推荐

