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

React+TS扩展InputHTMLAttributes时传data-*属性报ts(2322)错误原因

问题场景

使用React与TypeScript封装TextInput组件时,组件属性类型通过扩展InputHTMLAttributes<HTMLInputElement>实现,预期该写法支持直接传入所有原生input属性,无需逐个显式声明。
实际使用中传入任意data-*自定义属性时,TypeScript抛出类型错误:

Object literal may only specify known properties, and 'data-whatever' does not exist in type 'Partial'.ts(2322)
同属全局标准HTML属性的aria-*可以正常传入,无需额外兼容。当前临时修复方案为补充自定义索引签名:

type DataType = `data-${string}`

interface DataFix {
    [key: DataType]: string,
}
异常根因

该问题是@types/react类型定义的历史版本缺陷导致,和HTML标准、TypeScript本身的逻辑无关:

  • 对aria-*属性,@types/react很早就通过模板字符串类型声明了通用索引签名,所有符合aria-${string}格式的属性都会被类型系统判定为合法属性,因此可以直接传入。
  • 在@types/react18.0.28之前的版本中,类型定义没有为data-*属性添加对应的通用模板字符串索引签名,仅枚举了极少数特定场景的data属性,因此传入自定义的data-xxx属性时会触发未知属性的类型报错。
  • 你当前使用的临时修复方案,本质就是手动补全了@types/react缺失的data-*通用索引签名,和React类型库内部处理aria-*属性的逻辑完全一致。
解决方式
  • 优先将项目依赖中的@types/react升级到18.0.28及以上的稳定版本,官方已经在该版本后补充了data-*属性的通用类型声明,升级后无需额外编写兼容代码,即可正常传入任意data-*自定义属性。
  • 如果受项目依赖锁版本限制无法升级@types/react,当前使用的DataFix索引签名方案可以长期使用,不会引发类型冲突或运行时异常。

内容的提问来源于stack exchange,提问作者igor.live

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 22:39:24