reactjs - 为什么类型不能分配给泛型类型

标签 reactjs typescript generics typescript-typings typescript-generics

我正在尝试构建并键入一个 HOC,它只是将组件包装在 ApolloProvider 中。我希望能够将引用转发给包装的组件。但是,当我尝试在 forwardRef 组件中传递 Prop 时,我遇到了类型错误

在我疯狂研究的某个时候,我偶然发现了一个答案,它谈到泛型是问题所在。

const withProvider = function<P>(WrappedComponent: React.ComponentClass<P>) {

  type Props = P & { forwardedRef?: React.Ref<any> }

  class WithProvider extends React.Component<Props> {
    render() {
      const { forwardedRef, ...props } = this.props
      return (
        <ApolloProvider client={client}>
          <WrappedComponent {...props} ref={forwardedRef} />
        </ApolloProvider>
      )
    }
  }

  hoistNonReactStatics(WithProvider, WrappedComponent)

  return React.forwardRef((props, ref) => (
    <WithProvider {...props} forwardedRef={ref} />
  ))
}

给我错误:


Type '{ forwardedRef: string | ((instance: {} | null) => any) | RefObject<{}> | undefined; children?: ReactNode; }' is not assignable to type 'Readonly<Props>'

对我来说,这些应该匹配,前者应该可以分配给后者。我唯一能想到的是 Readonly<Props>包含一个泛型。

有人能指出我正确的方向吗?

最佳答案

最后,我找到了解决方案。

All you have to do is give the type of props (in React.forwardRef) as the type received which is P.

  return React.forwardRef((props:P, ref) => (
    <WithProvider {...props} forwardedRef={ref} />
  ));

完整代码:

const withProvider = function<P>(WrappedComponent: React.ComponentClass<P>) {

  type Props = P & { forwardedRef?: React.Ref<any> }

  class WithProvider extends React.Component<Props> {
    render() {
      const { forwardedRef, ...props } = this.props
      return (
        <ApolloProvider client={client}>
          <WrappedComponent {...props} ref={forwardedRef} />
        </ApolloProvider>
      )
    }
  }

  hoistNonReactStatics(WithProvider, WrappedComponent)

  return React.forwardRef((props:P, ref) => (
    <WithProvider {...props} forwardedRef={ref} />
  ))
}

关于reactjs - 为什么类型不能分配给泛型类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54451253/

相关文章:

typescript - AngularFire 2 发送密码重置电子邮件

java - 一个类可以有一个映射属性,其中 Class 对象作为键,作为该类对象列表的值吗?

c# - 来自参数的通用 T 而不是手动指定

javascript - 如何在 fetch 调用返回的每个对象中保留一些属性?

reactjs - Storybook 中缺少 MaterialUI 表 Prop

angular - 如何从 app.component 访问声明的变量到其他组件?

javascript - TypeScript:仅返回界面的一部分

android - Kotlin 泛型方法和继承

reactjs - 如何使用 react 路由器中的链接组件访问嵌套路由中的先前索引路由?

ReactJS - 在为新行输入数据时,如何将单元格文本包装在 MaterialTable 中?