在没有道具的 Typescript 中使用 React.forwardRef

Posted

技术标签:

【中文标题】在没有道具的 Typescript 中使用 React.forwardRef【英文标题】:Use React.forwardRef in Typescript with no props 【发布时间】:2021-02-03 12:58:58 【问题描述】:

我正在尝试将 ref 转发到不带任何道具的 Typescript 组件。当我使用React.forwardRef 时,它需要两个参数:props 和 ref。我的组件不使用道具。如何声明我的组件没有 linting 或编译错误?

现在我有:

// this says "props is declared but its value is never used"
const MyComponent = React.forwardRef((props = , ref: Ref<htmlDivElement>): JSX.Element => 
  return (
      <div ref=ref>
        Fun stuff
      </div>
  );
);

如果我像这样为我的道具声明一个空接口:

interface myProps 

然后我得到An empty interface is equivalent to '',但是当我尝试仅使用 声明并且没有实际接口时,我得到:

Don't use `` as a type. `` actually means "any non-nullish value".
- If you want a type meaning "any object", you probably want `Record<string, unknown>` instead.
- If you want a type meaning "any value", you probably want `unknown` instead.

有什么方法可以为这些 props 声明一个接口/类型,它需要一个空对象并且不会导致我出现 linting 问题?

更新:当我按照此问题线程的建议使用空对象类型时,会导致使用组件的位置出现类型错误。

Type ' ref: RefObject<HTMLDivElement>; ' is not assignable to type 'Pick<NoElements<Record<string, never>>, string>'.
  Property 'ref' is incompatible with index signature.
    Type 'RefObject<HTMLDivElement>' is not assignable to type 'never'.

显示在:

<MyComponent ref=refToForward />

似乎有鸡蛋的情况。

【问题讨论】:

如果您改用React.forwardRef&lt;HTMLDivElement, any&gt;() 会怎样? 【参考方案1】:

您可以在props 前加上一个下划线,例如_props,以去掉props is declared but its value is never used

对于空接口,我通常使用类型,因此,在您的情况下,这将是 type myProps =

更新:

我们如何将类型传递给&lt;&gt;,例如:

type Props = ;

const MyComponent = React.forwardRef<HTMLDivElement, Props>((props, ref) => 
  return (
      <div ref=ref>
        Fun stuff
      </div>
  );
);

【讨论】:

使用类型仍然给我一个错误:不要使用 作为类型。 实际上意味着“任何非空值”。 - 如果你想要一个表示“任何对象”的类型,你可能想要Record&lt;string, unknown&gt;。 - 如果你想要一个表示“任何值”的类型,你可能想要unknown 好的,所以我查看了它,看来您正在使用typescript-eslint 配置。基本上,repo 的 cmets 不鼓励您尝试做什么,但您始终可以 // eslint-disable-next-line 删除消息或重新配置您的 .eslintrc 文件: "rules": "@typescript-eslint/ban-types": [ "error", "extendDefaults": true, "types": "": false ] Basically, what are you trying to do is not encouraged in the comments of the repo。究竟是什么不被鼓励?你有链接吗?是否在某处提出了替代方案? 当然,这里是github.com/typescript-eslint/typescript-eslint/issues/… 看看bradzacher 评论的最后一部分,如果它意味着别的,请告诉我,因为我也想知道:) 我想推荐的方法是定义组件的 props,但由于您想省略它们,最好重新配置 eslint 或禁用该特定行上的特定规则

以上是关于在没有道具的 Typescript 中使用 React.forwardRef的主要内容,如果未能解决你的问题,请参考以下文章

在 Vue 3 Typescript 中将道具传递给数据对象

Typescript & React:在组件之间传递道具与默认道具

React Provider Pattern,子组件中的道具没有更新

修复“‘组件’没有任何构造或调用签名。” Typescript 的默认道具错误

如何在 Vue3 中启用仅使用 TypeScript 的道具键入

如何在 Typescript 中使用道具在情感/样式样式组件之间共享样式