能否利用类静态变量定义TypeScript联合类型?
可以用静态变量定义联合类型,这样写就行
你遇到的错误是因为在类型上下文里,Foo指的是类的实例类型,而静态属性属于类的值(构造函数对象),直接写Foo.typeId会被当成访问类型的属性,自然报错。
解决方法很简单:用typeof操作符获取类值的类型,再访问静态属性的类型,具体写法如下:
class Foo { static typeId = 'i-am-foo'; } class Bar { static typeId = 'i-am-bar'; } // 正确的联合类型定义 type MyUnionType = typeof Foo.typeId | typeof Bar.typeId;
这样MyUnionType就会被推断为'i-am-foo' | 'i-am-bar',完全符合你的需求。
如果后续要新增更多类,不想手动逐个写typeof X.typeId,可以用数组批量提取:
// 用as const固定数组元素的类型 const typeClasses = [Foo, Bar] as const; // 从数组元素的类型中提取typeId的联合类型 type MyUnionType = typeof typeClasses[number]['typeId'];
这种方式扩展性更好,新增类时只需要把它加到typeClasses数组里就行。
本质上,TypeScript中类同时扮演了**值(构造函数)和类型(实例类型)**两个角色:
- 当你在代码逻辑里用
Foo,它是构造函数对象,可以访问Foo.typeId这个静态值; - 当你在类型上下文里用
Foo,它代表的是Foo类的实例类型,这个类型里不包含静态成员,所以必须用typeof Foo来获取构造函数对象的类型,进而访问静态属性的类型。
内容的提问来源于stack exchange,提问作者baitendbidz
相关产品推荐
相关产品推荐

