TS 2540:无法分配给样式,因为它是只读属性

Posted

技术标签:

【中文标题】TS 2540:无法分配给样式,因为它是只读属性【英文标题】:TS 2540: Cannot assign to style because it is a read-only property 【发布时间】:2021-01-22 08:46:37 【问题描述】:

我在 TSX 标记中创建了一个 textarea 元素,而 TS typechecker in Vim 抱怨 2540: Cannot assign to style because it is a read-only property。将 textarea.style 设为只读有点奇怪,因为它可以写入...

如何使错误消息消失?我应该将代码中的input 变量转换为其他变量吗?

【问题讨论】:

我什至不知道这是否有效。我只在样式图中分配了属性。所以在这里可以使用例如Object.assign(input.style, whiteSpace: 'pre', position: 'absolute', left: '-9999px' ) @H.B.当然,这是一种方式。不过有点常见。显然不推荐使用字符串(根据 MDN):developer.mozilla.org/en-US/docs/Web/API/ElementCSSInlineStyle/… 【参考方案1】:

我解决了这个问题:

input.setAttribute('style', 'white-space: pre; position: absolute; left: -9999px;');

显然“TypeScript 在 Element 上没有样式属性。”正如related *** answer 中提到的那样。

【讨论】:

【参考方案2】:

显然,我已经有了答案……

说输入变量是使它工作的特定类型。

const input: htmlTextAreaElement = document.createElement('textarea')                                                                                                   
const currentTarget = e.currentTarget as HTMLDivElement    

这可能是因为createElementcan create all kinds of elements 和 Typescript 无法知道哪个,因为它是基于输入字符串的。所以你需要说出它返回的是什么。

【讨论】:

实际上,TypeScript 类型声明(此处为lib.dom.d.ts)具有重载,因此createElement 应该已经返回正确的类型。这不太可能是querySelector,它不一定只是一个标签名称。 (所以document.querySelector('a') 给你输入HTMLAnchorElementdocument.querySelector('a[href]') 只给你Element。)这里的问题是currentTarget,它不能自动输入。 > 这里的问题是currentTarget,不能自动输入。当然,这是一个问题,但这与所讨论的错误无关。 input 的隐式类型不可能是正确的,因为指定类型会使 TS2540 错误消失。如果 TS 认为它已经是 HTMLTextAreaElement ,那么指定它就是一个空操作。 这就是我的意思,it absolutely is a no-op。 此外,将字符串分配给style 应该总是给您一个错误,因为该属性被键入为只读。因此,您不应该得到错误的唯一方法是如果您以某种方式丢失了类型信息,例如断言any. @H.B. TS 编译器从不抱怨,但 linter 不知何故做到了,而且添加类型不是空操作,......不知道差异是由什么引起的。

以上是关于TS 2540:无法分配给样式,因为它是只读属性的主要内容,如果未能解决你的问题,请参考以下文章

C# NET 3.5:属性或索引器不能分配给“--”,它是只读的

属性或索引器不能分配给“”它是只读的[重复]

不能将属性或索引器“string.this[int]”分配给——它是只读的

无法分配给对象的只读属性

TypeError:无法分配给只读属性 - Karma

Vue导入导致无法分配给对象错误的只读属性'exports'