我只是想用我的KeyboardEvent做这个

var tag = evt.target.tagName.toLowerCase();

而事件。target是EventTarget类型,它不继承自Element。所以我必须像这样转换它:

var tag = (<Element>evt.target).tagName.toLowerCase();

这可能是因为一些浏览器不符合标准,对吧?TypeScript中正确的浏览器不可知实现是什么?

附注:我使用jQuery来捕获KeyboardEvent。


当前回答

我用这个:

onClick({ target }: MouseEvent) => {
    const targetElement: HTMLElement = target as HTMLElement;
    
    const listFullHeight: number = targetElement.scrollHeight;
    const listVisibleHeight: number = targetElement.offsetHeight;
    const listTopScroll: number = targetElement.scrollTop;
    }

其他回答

使用typescript,我使用了一个只适用于我的函数的自定义接口。示例用例。

  handleChange(event: { target: HTMLInputElement; }) {
    this.setState({ value: event.target.value });
  }

在这种情况下,handleChange将接收一个目标字段为HTMLInputElement类型的对象。

在后面的代码中,我可以使用

<input type='text' value={this.state.value} onChange={this.handleChange} />

更清晰的方法是将接口放到一个单独的文件中。

interface HandleNameChangeInterface {
  target: HTMLInputElement;
}

然后使用下面的函数定义:

  handleChange(event: HandleNameChangeInterface) {
    this.setState({ value: event.target.value });
  }

在我的用例中,明确定义了handleChange的唯一调用者是输入文本的HTML元素类型。

面向Angular 10+用户

只需声明HTML Input Element并将其扩展为使用目标作为对象,就像我下面为引导4+文件浏览器输入所做的那样。这样可以节省很多工作。

  selectFile(event: Event & { target: HTMLInputElement}) {
    console.log(event.target.files);
    this.selectedFile = event.target.files[0];
  }

我用这个:

onClick({ target }: MouseEvent) => {
    const targetElement: HTMLElement = target as HTMLElement;
    
    const listFullHeight: number = targetElement.scrollHeight;
    const listVisibleHeight: number = targetElement.offsetHeight;
    const listTopScroll: number = targetElement.scrollTop;
    }

3.2.4条打印稿

要检索属性,必须将目标转换为适当的数据类型:

e => console.log((e.target as Element).id)

JLRishe的答案是正确的,所以我只是在我的事件处理程序中使用这个:

if (event.target instanceof Element) { /*...*/ }