TS获取textarea光标位置报错selectionStart不存在于HTMLElement
问题原因
这个是TypeScript的类型校验报错,根源是类型不匹配:
document.getElementById方法的默认返回类型是HTMLElement | null,selectionStart、selectionEnd并不是通用HTMLElement上的属性,这两个属性只在HTMLTextAreaElement(textarea元素)、HTMLInputElement(输入框元素)两个类型上有定义。- 你之前手动加的
as HTMLElement断言,本质还是把元素标注成了通用DOM类型,哪怕去掉这个断言,TS自动推导的类型依然是通用HTMLElement,所以会一直提示属性不存在。
解决方法
把元素断言成对应的具体类型即可,同时补充空值判断避免运行时错误:
// 如果目标元素是textarea,就断言为HTMLTextAreaElement const elem = document.getElementById("text1") as HTMLTextAreaElement | null; if (elem) { // 这里TS可以正确识别到selectionStart属性,不会报错 const curPos = elem.selectionStart; // 后续计算浮层位置的逻辑可以写在这里 }
补充说明
- 如果你的目标元素是普通文本输入框
<input type="text">,只需要把断言类型换成HTMLInputElement即可,这个类型同样内置了selectionStart、selectionEnd的属性定义。 - 不要直接把元素断言为
any绕过类型校验,虽然能临时消除报错,但会丢失TS的类型提示能力,后续写代码很容易出低级错误。 - 非空判断不要省略,万一页面上不存在对应id的元素,直接访问属性会触发运行时空指针异常。
内容的提问来源于stack exchange,提问作者Boardy
相关产品推荐
相关产品推荐

