解決React報(bào)錯(cuò)Property value does not exist on type HTMLElement
總覽
當(dāng)我們?cè)噲D訪問一個(gè)類型為HTMLElement的元素上的value屬性時(shí),會(huì)產(chǎn)生"Property 'value' does not exist on type 'HTMLElement'"錯(cuò)誤。為了解決該錯(cuò)誤,在訪問屬性之前,使用類型斷言將元素類型斷言為HTMLInputElement。

這里有個(gè)示例用來展示錯(cuò)誤是如何發(fā)生的。
// App.tsx
import {useEffect} from 'react';
export default function App() {
useEffect(() => {
const input = document.getElementById('message');
// ?? Property 'value' does not exist on type 'HTMLElement'.ts(2339)
console.log(input?.value);
}, []);
return (
<div>
<input id="message" defaultValue="Initial value" />
</div>
);
}
我們得到錯(cuò)誤的原因是因?yàn)椋?a rel="external nofollow" target="_blank">document.getElementById方法返回的類型為HTMLElement | null ,并且value屬性不存在于HTMLElement類型上。
類型斷言
為了解決該錯(cuò)誤,使用類型斷言將元素類型斷言為HTMLInputElement(或者HTMLTextAreaElement,如果你使用textarea元素鍵入)。
import {useEffect} from 'react';
export default function App() {
useEffect(() => {
// ? type element as HTMLInputElement
const input = document.getElementById('message') as HTMLInputElement;
console.log(input?.value); // ??? "Initial value"
}, []);
return (
<div>
<input id="message" defaultValue="Initial value" />
</div>
);
}
你也可以在內(nèi)聯(lián)中使用一個(gè)類型斷言,就在訪問值屬性之前。
// App.tsx
import {useEffect} from 'react';
export default function App() {
useEffect(() => {
// ??? inline type assertion
const value = (document.getElementById('message') as HTMLInputElement).value;
console.log(value);
}, []);
return (
<div>
<input id="message" defaultValue="Initial value" />
</div>
);
}
當(dāng)我們擁有一個(gè)值的類型信息,但是TypeScript無從得知時(shí),就會(huì)使用類型斷言。
我們有效地告訴TypeScript,input變量存儲(chǔ)了一個(gè)HTMLInputElement,不用擔(dān)心它。
如果你正在使用一個(gè)textarea元素,你將使用HTMLTextAreaElement類型來代替。
聯(lián)合類型
如果你想更精確地控制類型,你可以使用一個(gè)聯(lián)合類型來設(shè)置類型為HTMLInputElement | null。
// App.tsx
import {useEffect} from 'react';
export default function App() {
useEffect(() => {
// ? type element as HTMLInputElement | null
const input = document.getElementById('message') as HTMLInputElement | null;
console.log(input?.value); // ??? "Initial value"
}, []);
return (
<div>
<input id="message" defaultValue="Initial value" />
</div>
);
}
HTMLInputElement | null類型是正確的,因?yàn)槿绻峁﹊d的元素不存在于DOM中,document.getElementById()方法就會(huì)返回一個(gè)null值。
需要注意的是,我們使用了可選鏈(?.)操作符來短路運(yùn)算,如果引用是空值的話(null或者undefined)。
換句話說,如果input變量存儲(chǔ)了一個(gè)null值,我們就不會(huì)試圖訪問null的屬性,而得到一個(gè)運(yùn)行時(shí)錯(cuò)誤。
類型守衛(wèi)
你也可以使用一個(gè)簡(jiǎn)單的if語句作為類型守衛(wèi),以確保input變量不存儲(chǔ)一個(gè)null值。
// App.tsx
import {useEffect} from 'react';
export default function App() {
useEffect(() => {
const input = document.getElementById('message') as HTMLInputElement | null;
if (input != null) {
console.log(input.value); // ??? "Initial value"
}
}, []);
return (
<div>
<input id="message" defaultValue="Initial value" />
</div>
);
}
TypeScript知道input變量在if塊中的類型是HTMLInputElement,并允許我們直接訪問其value屬性。
在類型斷言中包含null總是一種最佳實(shí)踐,因?yàn)槿绻麤]有找到所提供的id的元素,getElementById方法將返回null。
原文鏈接:bobbyhadz.com/blog/react-…
以上就是解決React報(bào)錯(cuò)Property value does not exist on type HTMLElement的詳細(xì)內(nèi)容,更多關(guān)于React 報(bào)錯(cuò)解決的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- 解決React報(bào)錯(cuò)Property does not exist on type 'JSX.IntrinsicElements'
- 解決React報(bào)錯(cuò)Property?'value'?does?not?exist?on?type?EventTarget
- 解決React報(bào)錯(cuò)Cannot assign to 'current' because it is a read-only property
- Can't?perform?a?React?state?update?on?an?unmounted?component報(bào)錯(cuò)解決
- Objects are not valid as a React child報(bào)錯(cuò)解決
- 解決React報(bào)錯(cuò)No duplicate props allowed
- 解決React報(bào)錯(cuò)`value` prop on `input` should not be null
- 解決React報(bào)錯(cuò)Property 'X' does not exist on type 'HTMLElement'
相關(guān)文章
解析React?ref?命令代替父子組件的數(shù)據(jù)傳遞問題
這篇文章主要介紹了React?-?ref?命令為什么代替父子組件的數(shù)據(jù)傳遞,使用?ref?之后,我們不需要再進(jìn)行頻繁的父子傳遞了,子組件也可以有自己的私有狀態(tài)并且不會(huì)影響信息的正常需求,這是為什么呢?因?yàn)槲覀兪褂昧?ref?命令的話,ref是可以進(jìn)行狀態(tài)的傳輸2022-08-08
React通過useContext特性實(shí)現(xiàn)組件數(shù)據(jù)傳遞
本文主要介紹了React如何通過useContext特性實(shí)現(xiàn)組件數(shù)據(jù)傳遞,文中有相關(guān)的代碼示例供大家參考,對(duì)我們學(xué)習(xí)React有一定的幫助,需要的朋友可以參考下2023-06-06
React組件內(nèi)事件傳參實(shí)現(xiàn)tab切換的示例代碼
本篇文章主要介紹了React組件內(nèi)事件傳參實(shí)現(xiàn)tab切換的示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-07-07
ahooks封裝cookie?localStorage?sessionStorage方法
這篇文章主要為大家介紹了ahooks封裝cookie?localStorage?sessionStorage的方法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07
React實(shí)現(xiàn)隨機(jī)顏色選擇器的示例代碼
顏色選擇器是一個(gè)用于選擇和調(diào)整顏色的工具,它可以讓用戶選擇他們喜歡的顏色,本文主要介紹了React實(shí)現(xiàn)隨機(jī)顏色選擇器的示例代碼,具有一定的參考價(jià)值,感興趣的可以了解一下2023-12-12
React使用Props實(shí)現(xiàn)父組件向子組件傳值
在React中,組件之間的數(shù)據(jù)傳遞通常是通過屬性(Props)來實(shí)現(xiàn)的,父組件可以通過屬性向子組件傳遞數(shù)據(jù),這是React組件通信的基礎(chǔ)模式之一,本文將探討如何使用Props來實(shí)現(xiàn)父組件向子組件傳遞數(shù)據(jù),需要的朋友可以參考下2025-04-04
React中常見的TypeScript定義實(shí)戰(zhàn)教程
這篇文章主要介紹了React中常見的TypeScript定義實(shí)戰(zhàn),本文介紹了Fiber結(jié)構(gòu),F(xiàn)iber的生成過程,調(diào)和過程,以及 render 和 commit 兩大階段,需要的朋友可以參考下2022-10-10
React如何使用錯(cuò)誤邊界(Error Boundaries)捕獲組件錯(cuò)誤
在 React 里,錯(cuò)誤邊界就像是一個(gè)“小衛(wèi)士”,專門負(fù)責(zé)在組件出現(xiàn)錯(cuò)誤時(shí)挺身而出,避免整個(gè)應(yīng)用因?yàn)橐粋€(gè)小錯(cuò)誤就崩潰掉,下面小編就來為大家介紹一下如何利用它捕獲組件錯(cuò)誤吧2025-03-03

