使用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
相关产品推荐
相关产品推荐

