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

TypeScript枚举衍生类型属性为何被标记为只读?赋值报错

为什么枚举映射类型的属性会被标记为只读?

你遇到的问题根源在于TypeScript枚举的类型特性:

  1. 枚举的双向映射与只读属性
    TypeScript的枚举会生成双向映射的对象,比如你定义的SpeedRanges,typeof SpeedRanges包含两部分:字符串键("slow"、"fast")对应数字值,同时数字值(0、1)也对应字符串键。更关键的是,枚举的成员本身是只读常量,所以typeof SpeedRanges中的所有属性默认都带有readonly修饰符。

  2. 映射类型保留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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 16:02:47