Don*_*and 6 generics typescript reactjs typescript-generics typescript-typings
我正在尝试构建和键入仅将组件包装在ApolloProvider中的HOC。我希望能够将引用转发到包装的组件。但是,当我尝试在forwardRef组件中传递道具时,出现类型错误
在研究狂潮的某个地方,我偶然发现了一个关于泛型是问题的答案。
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} />
))
}
Run Code Online (Sandbox Code Playgroud)
给我错误:
Type '{ forwardedRef: string | ((instance: {} | null) => any) | RefObject<{}> | undefined; children?: ReactNode; }' is not assignable to type 'Readonly<Props>'
Run Code Online (Sandbox Code Playgroud)
对我来说,这些应该匹配,并且前者应该分配给后者。我唯一能想到的就是Readonly<Props>包含一个泛型。
有人可以指出我正确的方向吗?
最后,我找到了解决方案。
您所要做的就是将 props (in ) 的类型指定
React.forwardRef为收到的类型,即P。
return React.forwardRef((props:P, ref) => (
<WithProvider {...props} forwardedRef={ref} />
));
Run Code Online (Sandbox Code Playgroud)
完整代码:
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} />
))
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
382 次 |
| 最近记录: |