TypeScript枚举衍生类型属性为何被标记为只读?赋值报错
为什么枚举映射类型的属性会被标记为只读?
你遇到的问题根源在于TypeScript枚举的类型特性:
枚举的双向映射与只读属性
TypeScript的枚举会生成双向映射的对象,比如你定义的SpeedRanges,typeof SpeedRanges包含两部分:字符串键("slow"、"fast")对应数字值,同时数字值(0、1)也对应字符串键。更关键的是,枚举的成员本身是只读常量,所以typeof SpeedRanges中的所有属性默认都带有readonly修饰符。映射类型保留readonly特性
当你使用[key in keyof typeof SpeedRanges]?: number创建映射类型时,TypeScript会自动继承原属性的readonly特性,最终生成的SpeedHistogram类型里,slow、fast等属性都是只读可选的数字类型。这就是给sh.slow赋值时触发2540错误的原因。
解决方法
如果只需要枚举的字符串键,并且要去掉只读限制,可以修改映射类型:
type SpeedHistogram = { -readonly [key in Exclude<keyof typeof SpeedRanges, number>]?: number; };
Exclude<keyof typeof SpeedRanges, number>:过滤掉枚举双向映射中的数字键,只保留字符串键-readonly:移除属性的只读修饰符,允许后续赋值
内容的提问来源于stack exchange,提问作者Yehezkel
相关产品推荐
相关产品推荐

