我正在实现一个定制jsxFactory功能的应用程序.所以,我的tsconfig.json如下:

{
    "compilerOptions": {
        "lib": ["es2015", "dom"],
        "jsx": "react",
        "jsxFactory": "createDOMElement"
    },
    "include": ["./src/**/*"]
}

其中createDOMElement是我 for each JMX元素调用的自定义函数.

我的申请代码如下:

function createDOMElement(tagName: string | Function, props: any, ...children: any[]) {
    /* my custom implementation */
}

function Button(data: { text: string }) {
    const button = (
        <button>{data.text}</button>
    );
    /* some logic here */
}

export function Main() {
    const el = (
        <Button text="the text" key="my-key"  />
    );

    /* some logic here */
}

如您所见,我定义了两个组件:

  • Button是接受字符串text作为属性的组件
  • Main是创建Button组件的组件,提供textkey个属性.

虽然text属性由Button签名定义,但key不是. 从概念上讲,组件Button不应该允许使用key.事实上,VSCode给了我一个错误:

Type '{ key: string; text: string; }' is not assignable to type '{ text: string; }'.
  Property 'key' does not exist on type '{ text: string; }'.ts(2322)

无论如何,一些像react这样的库允许规范key属性,即使组件没有将其作为属性,我想对jsxFactory的自定义实现也这样做.

如果我理解正确的话,这是一个类型脚本类型问题,JMX类型脚本命名空间允许我定义它,但我不明白如何让每个组件都有key属性. 我想实例化指定已定义属性和key属性的组件,即使没有指定它.

如何配置类型脚本来支持它?

推荐答案

为了支持key属性,您应该按照以下方式扩展IntrinsicAttributes接口:


declare global {
    namespace JSX {
        interface IntrinsicAttributes {
            key?: string
        }
    }
}

Typescript相关问答推荐

带脉轮UI的TypScript支持StyleProps的正确方法是什么?

已定义但从未使用通用推断的错误

如何声明循环数组类型?

当类型不能undefined时,如何使编译器抛出错误?

强制两个类型脚本对象具有相同的键

调用另一个函数的函数的Typescript类型,参数相同

即使子网是公共的,AWS CDK EventBridge ECS任务也无法分配公共IP地址

TypeScript类型不匹配:在返回类型中处理已经声明的Promise Wrapper

如何在第一次加载组件时加载ref数组

单击并移除for循环中的一项也会影响另一项

具有泛型类型和缺省值的键

使用2个派生类作为WeakMap的键

从子类集合实例化类,同时保持对Typescript中静态成员的访问

创建Angular 为17的动态形状时出错

我可以使用typeof来强制执行某些字符串吗

如何连接属性名称和值?

如何在Nextjs路由处理程序中指定响应正文的类型

编剧- Select 动态下拉选项

使用&reaction测试库&如何使用提供程序包装我的所有测试组件

我可以将一个类型数组映射到TypeScrip中的另一个类型数组吗?