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

能否利用类静态变量定义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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 21:55:39