为何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.
相关产品推荐
相关产品推荐

