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

使用as const处理常量文件对象时TypeScript类型推导异常

问题原因

直接定义对象并添加as const时,TypeScript会自动将每个属性值推断为字面量类型(比如0、1、2),因此取属性值的联合类型时能得到具体的字面量集合。

但从常量文件导入的someObject,默认类型是{ apple: number; orange: number; banana: number }——TypeScript已将它的属性值宽泛成number类型,丢失了具体的字面量信息。哪怕展开后加as const,也无法把已宽泛的number类型收窄回字面量,因为展开操作的类型推导基于原对象的已有类型。

解决方案

方案1:修改常量文件(推荐)

给常量文件里的someObject直接加上as const,保留字面量类型信息:

// 常量文件
const someObject = { apple: 1, orange: 2, banana: 3 } as const;

之后使用时直接展开,属性值的字面量类型会被保留:

const myObject = { ...someObject };
type myObjectType = typeof myObject[keyof typeof myObject]; // 类型是 1 | 2 | 3

方案2:不修改常量文件的处理方式

如果无法改动原常量文件,在展开时先把someObject断言为const类型,强制TypeScript恢复字面量类型:

const myObject = { ...(someObject as const) };
type myObjectType = typeof myObject[keyof typeof myObject]; // 类型是 1 | 2 | 3

通过以上方法,两种场景就能得到一致的类型结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 08:52:06