是否存在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
相关产品推荐
相关产品推荐

