【问题标题】:How can I get React.js TypeScript to accept 'parentElement' on 'event.target' with a onKeyDown event?如何让 React.js TypeScript 接受带有 onKeyDown 事件的“event.target”上的“parentElement”?
【发布时间】:2020-12-03 15:01:21
【问题描述】:

我有一个使用 React TypeScript 构建的特殊可访问元素,我正在尝试定义键来导航它并能够在表格元素中聚焦。它是专门为屏幕阅读器构建的......但是我似乎无法理解类型。

我无法摆脱以下错误:

“EventTarget”类型上不存在属性“parentElement”。ts(2339)

这是我要声明的函数:

 const keyDownHandler = (event: React.KeyboardEvent) => {
    event.preventDefault();

    if (event.key === "ArrowLeft") {
      (event.target.parentElement.nextElementSibling.firstElementChild as HTMLButtonElement).focus();
    }
    if (event.key === "ArrowUp") {
      console.log("keys.up");
    }
    if (event.key === "ArrowRight") {
      console.log("keys.right");
    }
    if (event.key === "ArrowDown") {
      console.log("keys.down");
    }
  };

我还尝试使用“!”强制输入作为

event.target.parentElement!.nextElementSibling.firstElementChild.focus();

(这些<td><button></button></td><tr/>中并排放置)

这是我的渲染方式:

 <table role="presentation" onKeyDown={keyDownHandler}>
        <DaysHeading />
        <DatesOfMonth
          year={dateObject.year}
          month={dateObject.month}
          datesOfMonth={dateObject.dates}
          setClickedDate={setClickedDate}
        />
      </table>

我错过了什么?

【问题讨论】:

    标签: javascript reactjs typescript focus


    【解决方案1】:

    这是因为 TypeScript 将 event.target 视为 EventTarget 类型,而不是 HTMLElement 类型。您可以通过将 event.target 转换为 HTMLElement 类型来解决这个问题。

    const keyDownHandler = (event: React.KeyboardEvent) => {
            event.preventDefault();
        
            if (event.key === "ArrowLeft") {
              const eventTarget: HTMLElement = event.target;
              (eventTarget.parentElement.nextElementSibling.firstElementChild as HTMLButtonElement).focus();
            }
            if (event.key === "ArrowUp") {
              console.log("keys.up");
            }
            if (event.key === "ArrowRight") {
              console.log("keys.right");
            }
            if (event.key === "ArrowDown") {
              console.log("keys.down");
            }
          };
    

    【讨论】:

    • 现在我在 eventTarget 上收到以下错误:“EventTarget”类型缺少“HTMLElement”类型的以下属性:accessKey、accessKeyLabel、autocapitalize、dir 和 231 more.ts(2740) 它是仍然看到 EventTarget 有什么建议吗?
    • 好的,尝试投射到HTMLInputElement 而不是HTMLElement
    • 这个语法为我解决了这个问题:const element = event.target as HTMLElement
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-25
    • 2022-11-28
    • 1970-01-01
    • 1970-01-01
    • 2021-09-13
    • 2023-03-12
    相关资源
    最近更新 更多