将“inert”属性与Typescript一起使用时出错

8xiog9wr  于 2023-11-20  发布在  TypeScript
关注(0)|答案(3)|浏览(134)

我使用Typescript模板创建了一个vanilla react应用程序。
我添加了这一行:

<dialog inert></dialog>

字符串
应用程序甚至不会运行,因为typescript抛出一个错误:
在src/App.tsx中出现错误:9:15 TS 2322:类型“{ children:never[]; inert:true; }"不可分配给类型”DetailedHTMLProps<DialogHTMLAttributes,HTMLDialogElement“。类型”DetailedHTMLProps<DialogHTMLAttributes,HTMLDialogElement“上不存在属性”inert“。
我想修复它,而不是忽略它,但即使忽略似乎也不起作用。

// @ts-ignore
return (<dialog inert></dialog>);

o7jaxewo

o7jaxewo1#

该类型尚未添加到React TypeScript定义中。有一个草案PR here正在工作中,所以如果get的合并应该可以工作。

yftpprvb

yftpprvb2#

一种简单的方法来解决React (as of writing) does not yet have type definitions for the inert attribute的问题,就是将其 Package 到一个对象中,然后将其解构回元素中:

<dialog
    // A silly workaround to use `inert` until https://github.com/facebook/react/pull/24730 is merged.
    {...{ inert: isInert ? '' : undefined }}
>
    Oh, hi
</dialog>

字符串
虽然很傻,但这应该会短路任何特定的TypeScript和ESLint投诉,并允许您使用它。请注意,如果这是元素上的 * 唯一 * 属性,* 并且 * 您的元素没有子元素,JSX本身可能仍然会向您抱怨。为什么要创建一个空的惰性元素,但sips tea与我无关。
一个稍微更强大的解决方案将是几件事的组合。
为了让TypeScript高兴,你可以为你的项目添加(或添加到)一个declarations.d.ts文件,在inert属性的临时定义中添加:

declare module 'react' {
  interface HTMLAttributes<T> extends AriaAttributes, DOMAttributes<T> {
    /**
     * Indicates that the browser will ignore this element and its descendants,
     * preventing some interactions and hiding it from assistive technology.
     * @see https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/inert
     * @todo Remove this stub declaration after https://github.com/facebook/react/pull/24730 is merged.
     */
    inert?: '';
  }
}


如果您使用的是ESLint,您可以通过the react/no-unknown-property rule在配置文件(.eslintrc或类似文件)中添加inert的异常:

rules: {
    // Allows the use of the `inert` attribute until https://github.com/facebook/react/pull/24730 is merged.
    'react/no-unknown-property': ['error', { ignore: ['inert'] }],
}


在这两种解决方案中,我们被迫使用稍微奇怪的语法,即向inert传递一个空字符串(对于true)或undefined(对于false)。与disabled这样的属性相比,这感觉有点笨拙,它可以直接接受布尔值。不幸的是,使用布尔值的这种方式是React添加到支持的属性中的语法糖,因此,在inert得到本机支持之前,我们无法获得它特殊好处。

yvfmudvl

yvfmudvl3#

将其添加到全局类型定义中:

declare namespace React {
  interface HTMLAttributes<T> {
    inert?: ''
  }
}

字符串
而不是使用它作为一个布尔,使用作为一个空字符串:

<dialog inert="" />


或者:

<dialog inert={shouldBeInert ? '' : undefined} />

相关问题