所以下面的代码是在Angular 4中,我不明白为什么它不能按预期的方式工作。

这是我的处理程序的一个片段:

onUpdatingServerName(event: Event) {
  console.log(event);
  this.newserverName = event.target.value; //this wont work
}

HTML元素:

<input type="text" class="form-control" (input)="onUpdatingServerName($event)">

代码给出了错误:

属性“value”在类型“EventTarget”上不存在。

但是在console.log中可以看到,该值确实存在于event.target上。


当前回答

声明接口

export interface HTMLInputEvent extends Event {
  target: HTMLInputElement & EventTarget;
}

哪种类型可以作为不同输入事件的类型重用

public onChange(event: HTMLInputEvent) {
  const value = event.target.value;
}

其他回答

我这样做的方式如下(比类型断言更好):

onFieldUpdate(event: { target: HTMLInputElement }) {
  this.$emit('onFieldUpdate', event.target.value);
}

这假设您只对目标属性感兴趣,这是最常见的情况。如果你需要访问事件的其他属性,一个更全面的解决方案包括使用&类型交集操作符:

event: Event & { target: HTMLInputElement }

这是Vue.js版本,但这个概念适用于所有框架。显然,你可以更具体,而不是使用一个通用的htmllinputelement,你可以使用例如HTMLTextAreaElement文本区域。

我正在用React寻找一个类似的TypeScript错误的解决方案:

在TypeScript中的EventTarget类型上不存在属性'dataset'

我想在React中获取一个点击按钮元素的event.target.dataset:

<button
  onClick={onClickHandler}
  data-index="4"
  data-name="Foo Bar"
>
  Delete Candidate
</button>

下面是我如何通过TypeScript获得数据集值“存在”:

const onClickHandler = (event: React.MouseEvent<HTMLButtonElement>) => {
  const { name, index } = (event.target as HTMLButtonElement).dataset
  console.log({ name, index })
  // do stuff with name and index…
}

要解决这个问题,使用$any类型转换函数($any($event.target).value)来停止模板中的类型检查。

点击这里阅读更多。

试试下面的代码:

  console.log(event['target'].value)

这对我有用:-)

声明接口

export interface HTMLInputEvent extends Event {
  target: HTMLInputElement & EventTarget;
}

哪种类型可以作为不同输入事件的类型重用

public onChange(event: HTMLInputEvent) {
  const value = event.target.value;
}