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

是否存在TypeScript编译选项可阻止readonly属性隐式转为可读写?

TypeScript中仅getter属性匹配可读写类型的问题

TypeScript默认的结构类型检查会让只有getter的属性通过可读写属性的类型校验——因为前者满足了“可读”的要求,但这种兼容性会导致你遇到的问题:编译通过,运行时赋值失败。

解决办法

目前没有专门的编译开关直接禁用这种行为,但可以通过以下方式规避:

  • 明确区分类型边界:如果你的类型要求属性必须可写,别用简单的{ p: number; },可以显式定义包含setter的类型,或者用readonly标记只读类型来划清界限:
    // 要求可读写的类型
    type WritableO = { 
      p: number;
      set p(value: number); 
    };
    // 只读类型
    type ReadonlyO = { readonly p: number; };
    
    // 现在赋值会直接报错,符合预期
    const r: WritableO = { get p() { return 2; } }; // 类型错误:缺少setter
    
  • 手动保证可写性:如果必须使用当前的类型定义,赋值时确保对象确实有可写的属性(要么带setter,要么是普通可写属性),避免仅getter的对象混入:
    // 正确的可写对象
    const r: O = { p: 2 };
    r.p = 3; // 运行正常
    

你的示例问题根源

你定义的O类型要求p是可读写的number,但赋值的对象只有getter没有setter,TypeScript的结构类型系统默认允许这种“只读属性兼容可读写属性”的赋值,但运行时修改只读属性自然会抛出错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 06:03:18