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

为何TypeScript不允许在类型定义中引用const变量?

解决TypeScript中用常量定义联合类型的问题

你可以通过以下两种方式实现用常量来定义限制输入的联合类型:

方法一:使用as const断言+typeof

给常量添加as const断言,让TypeScript将其推断为字符串字面量类型而非宽泛的string类型,再通过typeof获取类型并组成联合类型:

const DRAFT = 'DRAFT' as const;
const PUBLISHED = 'PUBLISHED' as const;

// 通过typeof获取常量的字面量类型,再组合成联合类型
type STATE_TYPE = typeof DRAFT | typeof PUBLISHED;

function myFunc(state: STATE_TYPE) {
  // ...
}

myFunc('DRAFT');    // 合法
myFunc('PUBLISHED');// 合法
// myFunc('OTHER'); // 报错,不符合类型限制

方法二:用as const对象统一管理常量

如果常量较多,建议把它们放在一个对象中并添加as const,再通过keyof和typeof提取所有值的类型:

const STATES = {
  DRAFT: 'DRAFT',
  PUBLISHED: 'PUBLISHED'
} as const;

// 提取对象所有值的字面量类型,组成联合类型
type STATE_TYPE = typeof STATES[keyof typeof STATES];

function myFunc(state: STATE_TYPE) {
  // ...
}

为什么原写法不生效?

默认情况下,TypeScript会把const DRAFT = 'DRAFT'推断为string类型(而非精确的'DRAFT'字面量),而且变量不能直接用在类型定义的位置,必须通过typeof来引用其类型。添加as const后,TypeScript会锁定常量的类型为具体的字符串字面量,这样typeof就能拿到精确的类型用于联合类型定义。

内容的提问来源于stack exchange,提问作者Ya.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 11:57:40