You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Angular 9下TypeScript报EventTarget无checked属性的解决方法

报错根因

TypeScript内置的DOM类型定义里,通用Event类型的target属性默认是最宽泛的EventTarget接口——这个接口只规定了所有DOM元素都具备的基础能力,比如添加、移除事件监听的通用方法,不包含单类元素的专属属性。而checked是复选框(<input type="checkbox">)独有的属性,归属于HTMLInputElement的类型定义范围,因此直接读取event.target.checked自然会触发“属性不存在”的类型检查报错。

无需使用any的合规解决方案

以下两种实现均适配Angular 9的开发场景,能完全通过严格的TypeScript类型校验:

方案1:在事件处理方法内做明确类型断言

我们在代码开发时很清楚当前的change事件是绑定在复选框元素上的,可以直接将事件目标收窄为对应的具体元素类型,属于安全的类型收窄,没有跳过类型检查:

public CheckBoxChange(event: Event) { 
  // 将事件目标明确断言为复选框对应的HTMLInputElement类型
  const checkboxInput = event.target as HTMLInputElement;
  this.service.change(this.d!.id.toString(), checkboxInput.checked)
    .subscribe(res => {
      console.log(res)
    }, err => {
      console.log(err)
    })
}

方案2:贴合Angular开发习惯,传递明确类型的参数

这种方式从根源上规避了原生Event类型的模糊问题,是Angular项目中更常用的写法:

  • 模板中给复选框添加模板引用变量,绑定事件时直接传入元素的checked值:
    <input type="checkbox" (change)="CheckBoxChange(checkboxRef.checked)" #checkboxRef>
    
  • 对应的组件方法不再接收原生Event对象,直接定义布尔类型的入参,类型完全明确:
    public CheckBoxChange(checked: boolean) { 
      this.service.change(this.d!.id.toString(), checked)
        .subscribe(res => {
          console.log(res)
        }, err => {
          console.log(err)
        })
    }
    

注意:两种方案都没有绕过TypeScript的类型校验。第一种是基于已知DOM结构的安全类型收窄,第二种是从模板绑定环节就传入了明确类型的值,全程没有使用any跳过检查。


内容的提问来源于stack exchange,提问作者jesox1

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.27 01:45:07