当子类化List-Element Class以添加进一步的类型时,应该重写@property修饰符还是只重写类型和初始值设定项?换句话说,假设我有这样的代码:

interface AB {
   a: number,
   b: string,
}

@customElement('my-parent')
class MyParent extends LitElement {
    @property({type: Array}) stuff: readonly any[] = [];
}

作为子类化的一种方式,以下哪一项是正确的:

@customElement('my-child')
class MyChild extends MyParent {
    override @property({type: Array}) stuff: readonly Readonly<AB>[] = [];
}

@customElement('my-child')
class MyChild extends MyParent {
    override stuff: readonly Readonly<AB>[] = [];
}

Both seem to be w或king in my codebase, so I'm not sure which to standardize to.

推荐答案

我认为这两种语法的工作更多的是来自于TypeScrip最初实现的类字段useDefineForClassFields: false,其中"被覆盖"的类字段最终仍然调用由装饰者在超类字段上添加的访问器.

从语义上讲,重写的属性也必须单独修饰,而不应该继承以前修饰的行为,这更有意义.因此,您的第一个用例(在基类和子类中使用@property)将是使用标准修饰符的唯一一个,这将需要accessor关键字将类字段转换为访问器.

参见TypeScript 3.7 Announcement,了解更多细节,特别是"这可能会对使用继承的现有代码造成相当大的影响.首先,基类中的set访问器不会被触发-它们将被完全覆盖."

请注意,如果库包含"es2022"或更高版本或"esNext",则useDefineForClassFieldsswitched to true by default.


以下是我的答案的较旧版本,这是不正确的.

奇怪的是,你在只读的东西上标记了@property,因为@property的意义是让它在设置时触发更新,而只读意味着你不会这样做.

在任何情况下,重写子类中没有@property的类属性都会移除react 性.

Javascript相关问答推荐

如何解决CORS政策的问题

如何在Connect 4游戏中 for each 玩家使用位板寻找7形状?

判断表格单元格中是否存在文本框

使用LocaleCompare()进行排序时,首先使用大写字母

简单的PayPal按钮集成导致404错误

如何通过使用vanilla JS限制字体大小增加或减少两次来改变字体大小

如何在bslib nav_insert之后更改导航标签的CSS类和样式?

WP Bootstrap NavWaker:下拉菜单一次打开所有下拉菜单

查询参数未在我的Next.js应用路由接口中定义

将Node.js包发布到GitHub包-错误ENEEDAUTH

使用带有HostBinding的Angular 信号来更新样式?

将对象推送到数组会导致复制

Next.js中的服务器端组件列表筛选

基于产品ID更新条带产品图像的JavaScript命中错误

postman 预请求中的hmac/sha256内标识-从js示例转换

有没有办法更改Chart.js 3.x.x中主要刻度的字体?

如何在每隔2分钟刷新OKTA令牌后停止页面刷新

表单数据中未定义的数组键

限制数组中每个元素的长度,

如何在预览中显示html+css与数据URL?