使用子类中的 getter/setter 对覆盖 JavaScript/TypeScript 基类中的属性是否有效?

2024-02-19

最近,TypeScript引入了编译错误 https://github.com/microsoft/TypeScript/pull/37894,当用户尝试使用 getter/setter 对覆盖基类中的属性时(属性访问增强):

class BaseClass {
    prop        : string        = 'base_class'
}

class SubClass extends BaseClass {
    _prop       : string        = 'sub_class'

    /*
       ERROR: 'prop' is defined as a property in class 'BaseClass', but is overridden here in 'SubClass' as an accessor.
    */
    get prop () : string {
        return this._prop
    }
    set prop (value : string) {
        this._prop = value
    }
}
// try running this snippet with `useDefineForClassFields : true` and `useDefineForClassFields : false`
console.log((new SubClass).prop)

这个错误的原因是,在现代 JavaScript 中,类字段具有 [[DEFINE]] 语义,并且上面的示例不会按直觉预期工作 https://github.com/microsoft/TypeScript/pull/37894#issuecomment-862533006 if useDefineForClassFields编译器选项设置为true.

属性访问增强模式

需要注意的是,历史上没有人对类属性使用 DEFINE 语义。目前,世界上几乎所有 JavaScript 和 TypeScript 代码都采用类字段的 SET 语义。

属性访问增强模式对于 SET 语义来说是完全有效的。这是非常惯用的 JavaScript。它的主要用例是在属性读/写时触发一些任意代码。这对于各种目的都非常有用,只需使用 getter/setter 访问器对覆盖基类的属性即可完成。

TypeScript 和 JavaScript 历史上对类字段使用 SET 语义。引入 DEFINE 语义后,TypeScript 添加了新的编译器配置,useDefineForClassFields,它控制类字段的语义,默认情况下处于禁用状态,因为它是一个重大更改。

问题:

  1. 当类字段语义为 [[Set]] 时,您认为属性访问增强模式是否有效并且应该受到 TypeScript 支持(useDefineForClassFields=false这是默认值)
  2. 您在 JavaScript/TypeScript 代码库中使用此模式吗?如果是这样,请提供用法示例作为答案。

也可以看看:建议将编译错误限制为仅定义语义 https://github.com/microsoft/TypeScript/issues/44927


None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用子类中的 getter/setter 对覆盖 JavaScript/TypeScript 基类中的属性是否有效? 的相关文章

随机推荐

  • Angular 4 - 获取输入值

    我想知道如何从角度 4 上的输入获取值 我查看了有关 Angular 的文档 并且带有关键事件的示例对我来说效果不太好 我找不到正确的示例如何做到这一点 所以请帮助我 问题 我尝试读取输入的值 然后将值提交到另一个组件 该组件会将值添加到选
  • 如何在opencv中使某些像素透明?

    我用 for 语句检查了每个像素的亮度 并尝试在亮度超过 100 时使其透明 但隐形是行不通的 看代码 image al x y 的第四个是alpha 我应该怎么办 如果你使用 bgr 的值而不是透明度 它就会改变 image cv2 im
  • symfony2 - Doctrine - 如何使用计数和分组进行多重选择

    在 Symfony2 和 Doctrine 中 我想执行一个返回计数和分组依据的查询 这是我尝试过的 这是我要运行的 SQL SELECT terrain id COUNT FROM Partie WHERE 1 1 GROUP BY te
  • 扩展/插件通信的架构

    一旦解决了加载插件的问题 在 NET 中 在例外情况下通过 MEF 下一步要解决的是与它们的通信 简单的方法是实现一个接口并使用插件实现 但有时插件只需要扩展应用程序的工作方式 并且可能有很多扩展点 我的问题是关于如何处理这些扩展点 我已经
  • 多态调用的成本 - C++

    我正在用 C 编写一个游戏 其中有大约 30 个不同的角色 每个角色都略有不同 我有一个主类 User 其中包含所有角色所需的所有数据 我的第一个实现涉及仅枚举 30 个角色并进行适当的处 理 但现在我想知道将 User 作为基类并且每个角
  • 谷歌搜索引擎优化和隐藏元素

    谷歌会忽略CSS中设置为 display none 的元素内的单词吗 Example div style display none About Us Contact Us div 我想隐藏这样的菜单看起来可能有点奇怪 但是有一个子菜单 并将
  • PersistFieldSql 的 GeneralizedNewtypeDeriving 失败

    我正在尝试定义一个Markdown https hackage haskell org package markdown 0 1 9 docs Text Markdown html新类型 并使用GeneralizedNewtypeDeriv
  • 如何在 Laravel 5 中建立用户和角色关系

    我有两张桌子 User gt id name role id gt references id gt on roles Roles gt id role name access 我正在尝试从用户访问角色详细信息 我的用户模型有 public
  • 如何使用 Bower 进行最小安装

    我使用 Bower 来管理项目中使用的所有前端库和工具 我的bower json文件看起来像这样 name New Project version 0 1 0 dependencies jquery 1 11 1 bootstrap 3 3
  • SqlException:用户“NT AUTHORITY\NETWORK SERVICE”登录失败

    当我通过 VS 2008 运行 Web 应用程序时 该应用程序能够登录到 Sql 服务器并检查用户输入的凭据 用户名和密码 但是当我通过 IIS 7 浏览到该应用程序并尝试回发用户名和密码时 应用程序报告异常 System Data Sql
  • 在 C++ 中描述虚函数的最简洁而准确的方法是什么?

    在评估基本 C 知识的面试中 被要求描述什么是虚函数似乎是最常见的问题之一 然而 在 C 编程几年之后 我仍然有一种不舒服的感觉 即我并不真正理解如何最好地定义它们是什么 如果我查阅维基百科 我看到虚函数的定义是 在面向对象编程中 虚函数或
  • 是否可以选择属性值大于某个数字的所有元素?

    我想知道 CSS 是否可以实现以下功能 HTML 代码 span class funny elem Hello World span span class funny elem Hello Bird span span class funn
  • 系统还原后无法从 Windows 7 卸载 Python 3.4.2

    卸载 Python 3 4 2 几天后 我不得不执行系统还原 我使用的是 Windows 7 因为不小心安装了一堆垃圾软件 即使在安装后 这些垃圾软件也弄乱了我的计算机 这个系统恢复有效地 重新安装 了Python 或者更确切地说是它的损坏
  • printf 中的否定

    我有下面的代码 我不确定为什么 printf 内部的否定与外部的否定不同 char d 0x04 printf Value of d X n d d d printf Value of d X n d 打印的结果是FFFFFFFB和FB 这
  • 语法“%s”和“%d”作为调用变量的简写意味着什么?

    在此示例中 s 和 d 是什么意思 看来它是调用变量的简写 这种语法只能在类中使用吗 Class class Building Object variables properties private number of floors 5 T
  • 当您安装了 Google Analytics 时,_gl 参数对于跨域跟踪的重要性

    我有一个网站及其预订引擎 2 个不同的域 正在运行 访问者登陆该网站 然后进入预订引擎 我已正确安装 Google Analytics 分析 来衡量预订引擎域中发生的转化 一切都正确记录在 Google Analytics 帐户中 我们最近
  • 即使没有任何变化,触摸 DOM 是否会触发回流和重绘?

    我正在开发一个小型 JavaScript 模板引擎 当模型发生变化时 我有两种可能的方法来处理 DOM 的更新 在执行之前检查 DOM 更新是否确实需要 这样做的好处是不会冒不必要的更新风险 但我在跟踪旧值上浪费了空间 if oldValu
  • 发现不同版本的“System.Runtime.CompilerServices.Unsafe”之间存在无法解决的冲突

    这似乎是许多类似问题之一 但我在其他问题中找不到解决方案 我将直接跳到二进制日志 这是相应的子树ResolveAssemblyReference task There was a conflict between System Runtim
  • 使用相对路径检查文件是否存在

    使用相对路径检查文件是否存在的最佳方法是什么 我使用了以下方法 但尽管文件存在 但它返回 false bool a File Exists images Customswipe a png 那不是相对路径 你需要放弃第一个 否则它将被解释为
  • 使用子类中的 getter/setter 对覆盖 JavaScript/TypeScript 基类中的属性是否有效?

    最近 TypeScript引入了编译错误 https github com microsoft TypeScript pull 37894 当用户尝试使用 getter setter 对覆盖基类中的属性时 属性访问增强 class Base