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

如何在TypeScript中从对象创建字符串字面量联合类型?

问题

现有代码:

const FOO_TYPES={ FOO:'foo', FAA:'faa' }

希望通过这个对象程序化创建如下类型:

type FooTypes = "foo" | "faa"

让TypeScript在传入非指定值时抛出错误。之前使用过类似的类型定义:

type ObjectValues<T>=T[keyof T]

但这个类型仅匹配类型,不会检查允许的具体值。

解决方案

核心是让TypeScript保留对象属性的字面量类型,而非自动拓宽为string类型,具体步骤如下:

  1. 给原始对象添加as const断言,锁定属性值的字面量类型:
const FOO_TYPES = { FOO: 'foo', FAA: 'faa' } as const;
  1. 复用你定义的ObjectValues类型:
type ObjectValues<T> = T[keyof T];
  1. 生成目标联合类型:
type FooTypes = ObjectValues<typeof FOO_TYPES>;

此时FooTypes的类型就是"foo" | "faa",当传入非这两个值的参数时,TypeScript会直接抛出类型错误。

原因说明

之前的写法无效,是因为TypeScript默认会把对象中的字符串属性值自动拓宽为string类型,导致ObjectValues<typeof FOO_TYPES>最终得到的是string类型,而非具体的字面量联合。as const断言会强制TS将对象的每个属性值视为不可变的字面量,这样keyof T对应的属性值就能被准确提取为联合类型。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 23:55:19