TypeScript JSX中是否存在可复用的通用HTMLElement基础类型定义?
问题
我现在在TypeScript/JSX里使用一个没有附带TypeScript声明文件的Web组件(刚接触TS和JSX)。但不想用文档里提到的[elemName: string]: any;这种宽松的声明:
declare global { namespace JSX { interface IntrinsicElements { [elemName: string]: any; } } };
也不想用下面这种只开放任意属性的调整版本:
interface IntrinsicElements { "my-external-component": {[attribute: string]: any}; }
我希望能有一个通用的HTMLElement类型,像这样交叉声明:
interface MyExternalComponent { "api-key": string } declare global { namespace JSX { interface IntrinsicElements { "my-external-component": MyExternalComponent & BaseHTMLElement; } } };
这个类型需要包含所有官方HTMLElement的属性键值对。请问有没有类似BaseHTMLElement的现成类型?是不是需要自己定义?或者有没有可复用的通用声明?
解决方案
1. 直接使用React内置的标准属性类型
TypeScript和React已经内置了包含所有通用HTML属性的类型,无需自行定义:
通用HTML元素属性可以用**
React.HTMLAttributes<HTMLElement>**,它涵盖了id、className、style、所有标准事件处理函数(如onClick、onChange)等通用属性。用法示例:
interface MyExternalComponent { "api-key": string; } declare global { namespace JSX { interface IntrinsicElements { "my-external-component": MyExternalComponent & React.HTMLAttributes<HTMLElement>; } } };
2. 针对特定原生元素的属性类型
如果你的Web组件是基于某个具体原生元素(如<div>、<input>)开发的,可以用更精准的类型,比如:
React.DivHTMLAttributes<HTMLDivElement>(对应<div>的专属属性)React.InputHTMLAttributes<HTMLInputElement>(对应<input>的专属属性,如type、value)
3. 自定义基础类型(可选)
如果需要扩展或过滤通用属性,也可以基于内置类型封装自己的BaseHTMLElement:
// 自定义包含通用HTML属性+额外自定义属性的基础类型 type BaseHTMLElement = React.HTMLAttributes<HTMLElement> & { "data-common"?: string; // 添加自定义通用属性 }; // 后续使用 interface MyExternalComponent { "api-key": string; } declare global { namespace JSX { interface IntrinsicElements { "my-external-component": MyExternalComponent & BaseHTMLElement; } } };
这种方式既实现了自定义组件属性的强类型检查,又保留了标准HTML属性的类型提示与校验,完全避免了any带来的类型安全问题。
内容的提问来源于stack exchange,提问作者Basti
相关产品推荐
相关产品推荐

