我正在重構一個舊專案并將其從 javascript 轉換為 typescript。在我的一個函式中,我正在使用元素的位置yPos(yPos 似乎只有在元素被拖動后才啟用),目的是將它拖到另一個位置并放下它,但是當我嘗試獲取屬性時yPos我得到這個錯誤:
Property 'yPos' does not exist on type 'Element'.ts(2339)
我收到HTMLCollection帶有 12 個節點(全部div)的 a 作為引數,遍歷它并獲取yPos實際元素的:
const whereAmI = (nodes: HTMLDivElement) => {
Array.from(nodes.children).forEach((el, i) => {
console.log('el.yPos: ', el.yPos)
})
}
在原始代碼中,我使用了一個for回圈:
for (let i = 0; i < nodes.children.length; i ) {
const el = nodes.children[i]
console.log('el.yPos: ', el.yPos)
}
從我讀過的所有內容中,我想也許我不應該設定nodes: HTMLDivElement,而是使用另一種型別,但我無法弄清楚是哪一種。我也認為也許我應該el用其他東西投射,但我找不到任何適合我需要的東西。
uj5u.com熱心網友回復:
看起來像是通過未附加代碼直接在節點上設定的yPos一些非標準屬性。
為了讓 TypeScript 意識到這一點,您可以HTMLDivElement使用附加屬性顯式宣告這些 are :
type DivWithPosition = HTMLDivElement & { yPos: number }
const elWithPosition = el as DivWithPosition
console.log('elWithPosition.yPos: ', elWithPosition.yPos)
請注意,這樣as的強制轉換在某種程度上是一種逃避,基本上通過信任宣告來關閉型別檢查。
有時 TypeScript 不會接受這樣的強制轉換,并會要求先強制轉換為未知型別:
const elWithPosition = el as unknown as DivWithPosition
建議:標準資料屬性語法可能是在 HTML 元素上存盤附加資料的更好選擇。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/507240.html
標籤:javascript 反应 打字稿 类型 html集合
上一篇:限制JavaScript運行X次
