代码之家  ›  专栏  ›  技术社区  ›  recursive

是否有一个typescript编译器选项可以防止从只读属性到读/写的隐式扩展?

  •  1
  • recursive  · 技术社区  · 5 月前

    默认情况下,typescript会处理 readonly 对象属性在类型检查期间满足标准读/写属性。这在没有类型断言或任何其他技巧的情况下发生。这是一种令人惊讶的行为,可能会导致运行时问题。是否有任何方法可以使用编译器选项关闭此功能?我做错了吗?

    这里 an example 我在说什么。

    type O = { p: number; };
    const r: O = { get p() { return 2; } };
    
    // Passes type checking, but fails at run time.
    // Uncaught TypeError: setting getter-only property "p"
    r.p = 3; 
    
    
    1 回复  |  直到 5 月前
        1
  •  1
  •   jcalz    5 月前

    这是一个长期存在的已知稳健性问题,可在 microsoft/TypeScript#13347 .目前a readonly property 会阻止你给它写信 直接地 ,但仍被认为 可分配 往返于非- 只读 财产。这种可分配性是为了使该功能不会对现有代码造成巨大的破坏性变化。不是 完全地 这样没用,但令人惊讶的是,关于同一主题的另一个问题, microsoft/TypeScript#13002 ,最初被命名为 "readonly modifiers are a joke" .

    从TypeScript 5.7开始,在该语言的任何发布版本中都没有编译器选项来解决这个问题。然而,有一个 --enforceReadonly 在pull请求时标记实现 microsoft/TypeScript#58296 ,由TypeScript语言架构师编写。因此,在不久的将来,这很有可能成为语言的一部分。在设计会议笔记中 microsoft/TypeScript#59406 TypeScript 5.7迭代计划 微软/TypeScript#58296 看起来他们正在考虑用TypeScript 5.7实现这一点,但似乎没有发生。我没有看到TypeScript 5.8的迭代计划,所以我也不确定它是否会成为该版本的一部分。也许是TypeScript 5.9?当然,如果它真的发布了,对任何启用它的人来说,这仍然是一个相当大的突破性变化,这就是为什么它 --enforceReadonly 而不是 --strictReadonly ;它不会成为 the --strict suite of compiler options .

    除非它被合并,否则你只需要处理它,即使它被合并了,如果你依赖于它破坏的任何库,你可能也无法立即使用该编译器选项。现在,你应该小心 只读 物业。

    推荐文章