我的编程空间,编程开发者的网络收藏夹
学习永远不晚

解决React报错Property'X'doesnotexistontype'HTMLElement'

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

解决React报错Property'X'doesnotexistontype'HTMLElement'

总览

在React中,当我们试图访问类型为HTMLElement 的元素上不存在的属性时,就会发生Property 'X' does not exist on type 'HTMLElement'错误。为了解决该错误,在访问属性之前,使用类型断言来正确地类型声明元素。

这里有三个例子来展示错误是如何发生的。

// App.tsx
import {useEffect} from 'react';
export default function App() {
  useEffect(() => {
    const input = document.getElementById('first_name');
    // ⛔️ Property 'value' does not exist on type 'HTMLElement'.ts(2339)
    console.log(input?.value);
    // -----------------------------------------------------------------
    const link = document.getElementById('link');
    // ⛔️ Property 'href' does not exist on type 'HTMLElement'.ts(2339)
    console.log(link?.href);
    // -----------------------------------------------------------------
    const button = document.getElementById('btn');
    if (button != null) {
      // ⛔️ Property 'disabled' does not exist on type 'HTMLElement'.ts(2339)
      button.disabled = true;
    }
  }, []);
  return (
    <div>
      <input
        id="first_name"
        type="text"
        name="first_name"
        defaultValue="Initial Value"
      />
      <a id="link" href="<https://google.com>" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  target="_blank" rel="noreferrer">
        Open Google
      </a>
      <button id="btn">Submit</button>
    </div>
  );
}

产生错误的原因是,document.getElementById方法的返回类型是HTMLElement | null,但是我们试图访问的属性不存在于HTMLElement 类型。

类型断言

为了解决这个错误,使用类型断言来为元素正确地进行类型声明。比如说,类型断言为HTMLInputElementHTMLButtonElementHTMLAnchorElementHTMLImageElementHTMLDivElementHTMLTextAreaElement等等。这取决于你所处理的元素。

这些类型始终命名为HTML***Element 。一旦你开始输入HTML…,你的IDE将会帮你自动补全。

import {useEffect} from 'react';
export default function App() {
  useEffect(() => {
    // ✅ type elements correctly via type assertions
    const input = document.getElementById('first_name') as HTMLInputElement;
    console.log(input?.value);
    const link = document.getElementById('link') as HTMLAnchorElement;
    console.log(link?.href);
    const button = document.getElementById('btn') as HTMLButtonElement;
    if (button != null) {
      button.disabled = true;
    }
  }, []);
  return (
    <div>
      <input
        id="first_name"
        type="text"
        name="first_name"
        defaultValue="Initial Value"
      />
      <a id="link" href="<https://google.com>" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  target="_blank" rel="noreferrer">
        Open Google
      </a>
      <button id="btn">Submit</button>
    </div>
  );
}

类型断言被用于我们知道值的类型信息,但是TypeScript却不知道的时候。

我们明确的告诉TypeScript,input变量上存储了HTMLInputElement ,并让TS不要担心。

同样的,我们将link变量类型声明为HTMLAnchorElement,将btn变量类型声明为HTMLButtonElement

你可以在访问一个属性之前,内联使用类型断言。

import {useEffect} from 'react';
export default function App() {
  useEffect(() => {
    const value = (document.getElementById('first_name') as HTMLInputElement).value;
    console.log(value);
  }, []);
  return (
    <div>
      <input
        id="first_name"
        type="text"
        name="first_name"
        defaultValue="Initial Value"
      />
      <a id="link" href="<https://google.com>" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  target="_blank" rel="noreferrer">
        Open Google
      </a>
      <button id="btn">Submit</button>
    </div>
  );
}

如果你只需要访问属性一次,并且不希望将元素分配给变量,那么内联类型声明可以完成这项工作。

如果你想更精确地处理元素的类型,可以使用联合类型将类型声明为HTML***Element | null

import {useEffect} from 'react';
export default function App() {
  useEffect(() => {
    const input = document.getElementById(
      'first_name',
    ) as HTMLInputElement | null;
    console.log(input?.value);
    const link = document.getElementById('link') as HTMLAnchorElement | null;
    console.log(link?.href);
    const button = document.getElementById('btn') as HTMLButtonElement | null;
    if (button != null) {
      button.disabled = true;
    }
  }, []);
  return (
    <div>
      <input
        id="first_name"
        type="text"
        name="first_name"
        defaultValue="Initial Value"
      />
      <a id="link" href="<https://google.com>" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  target="_blank" rel="noreferrer">
        Open Google
      </a>
      <button id="btn">Submit</button>
    </div>
  );
}

HTML***Element 或者null 类型是最准确的类型,因为如果DOM元素上不存在id属性,那么document.getElementById()将会返回null

你可以使用可选链操作符(?.)在访问属性之前来进行短路运算,如果引用是空值(null或者undefined)的话。

或者,你可以使用简单的if语句作为类型守卫,就像我们对button处理的那样。

总结

最佳实践是在类型断言中包含null 。因为如果元素上面不提供id属性,那么getElementById方法将会返回null

以上就是解决React报错Property 'X' does not exist on type 'HTMLElement'的详细内容,更多关于React报错解决Property X的资料请关注编程网其它相关文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

解决React报错Property'X'doesnotexistontype'HTMLElement'

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

解决React报错Property'X'doesnotexistontype'HTMLElement'

这篇文章主要为大家介绍了解决React报错Property'X'doesnotexistontype'HTMLElement',有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2022-12-08

React报错Type'()=>JSX.Element[]'isnotassignabletotypeFunctionComponent

这篇文章主要为大家介绍了React报错Type'()=>JSX.Element[]'isnotassignabletotypeFunctionComponent解决,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2022-12-19

TS报错:Parameter 'xxx' implicitly has an 'any' type的解决方式

这篇文章主要给大家介绍了关于TS报错:Parameter 'xxx' implicitly has an 'any' type的解决方式,文中将产生错误的原因及解决方法都介绍的非常详细,需要的朋友可以参考下
2022-11-13

数据库报错:Unknowncolumn'xxx'in'whereclause'问题的解决过程

但凡写过sql语句的人估计都曾经碰到过类似于Unknowncolumn‘xxx’in‘whereclause’的问题,这篇文章主要给大家介绍了关于数据库报错:Unknowncolumn'xxx'in'whereclause'问题的解决过程,需要的朋友可以参考下
2023-03-02

Mysql报错Duplicate entry '值' for key '字段名'的解决方法

遇到这种问题, 是你的数据库表那个字段设置了唯一索引。所以这个字段新增的数据不能重复。具体可以打开表,然后点击表设置,具体教程可以看下文章最后Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLI
2023-04-14

Mysql报错Duplicate entry '值' for key '字段名'的解决方法

今天在使用数据库的过程中,发现一直报Duplicate entry '值' for key '字段名'的错误,所以下面这篇文章主要给大家介绍了关于Mysql报错Duplicate entry '值' for key '字段名'的解决方法,需要的朋友可以参考下
2023-05-16

Python错误NameError:name 'X' is not defined的解决方法

这篇文章主要给大家介绍了关于Python错误NameError:name ‘X‘ is not defined的解决方法,这是最近工作中遇到的一个问题,文中通过实例代码将解决的方法介绍的非常详细,需要的朋友可以参考下
2023-05-14

数据库报错:Unknown column 'xxx' in 'where clause'问题的解决过程

目录前言一、报错Unknown column ‘xxx’ in ‘where clause’1.1 问题分析1.2找不到属性1.3找不到字段总结前言本人做SSM项目的时候,在做删除功能时,发
2023-03-02

Python中TypeError:unhashable type:'dict'错误的解决办法

这篇文章主要给大家介绍了关于Python中TypeError:unhashable type:'dict'错误的解决办法,文中通过实例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
2023-05-15

npm ERR!Cannot read properties of null(reading 'pickAlgorithm')报错问题解决

这篇文章主要给大家介绍了关于npm ERR!Cannot read properties of null(reading 'pickAlgorithm')报错问题的解决方法,文中通过图文介绍的非常详细,需要的朋友可以参考下
2023-03-03

解决vue运行报错Error:Cannot find module '@vue/cli-plugin-babel'

解决了因为版本问题在创建项目时出现的各种报错问题,这次在运行时出现的问题,下面这篇文章主要给大家介绍了关于解决vue运行报错Error:Cannot find module '@vue/cli-plugin-babel'的相关资料,需要的朋友可以参考下
2023-05-17

VUE3刷新页面报错问题解决:Uncaught SyntaxError:Unexpected token '<'

这篇文章主要介绍了VUE3刷新页面报错:Uncaught SyntaxError: Unexpected token ‘<‘,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
2023-03-24

angular报错can'tresolveallparametersfor[]的解决

这篇文章主要介绍了angular报错can'tresolveallparametersfor[]的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2023-03-06

vscode输入npm install报错:node-sass@8.0.0 install:'node scripts/install.js'解决

这篇文章主要给大家介绍了关于vscode输入npm install报错:node-sass@8.0.0 install:'node scripts/install.js'的解决方法,文中通过图文介绍的非常详细,需要的朋友可以参考下
2023-02-16

mysql建表报错:invalid default value for 'date'的解决方法

最近遇到一个这样的问题,出现了invaliddefaultvaluefor'end_date'错误,所以下面这篇文章主要给大家介绍了关于mysql建表报错:invalid default value for 'date'的解决方法,需要的朋友可以参考下
2022-12-15

编程热搜

目录