gpt4 book ai didi

javascript - 使用 recompose 和 typescript 正确输入 HigherOrderComponents

转载 作者:搜寻专家 更新时间:2023-10-30 21:46:32 25 4
gpt4 key购买 nike

我目前正在尝试将重组纳入我的 React 代码库。因此,我试图让一些基本的东西工作,并且我让它工作了,但我不太确定,如果这是重构的正确工作方式。

所以我有以下代码:

interface Value {
value: string
}

interface Loading {
loading: boolean
}

const TestComponent = (props: Value) => <div>Value: {props.value}</div>
const LoadingComponent = () => <div>Loading ...</div>

所以我有一个 TestComponent,它应该显示 props 中提供的值,另外我还有一个 LoadingComponent,它应该在设置加载 props 时显示。

所以我使用了 branch重组功能

const withLoading = branch<Loading>(
({loading}) => loading,
renderComponent(LoadingComponent)
)

现在当我使用 withLoading任何没有 Prop 的组件上,我可以在它们上面设置加载 Prop 。

const EnhancedCompWithLoading = withLoading(SomeCompWithoutProps)

render() {
return <EnhancedCompWithLoading loading={this.state.loading} />
}

这对我来说很好,真正的问题是在尝试将它与带有 Prop 的组件一起使用时开始。当我这样尝试时:

const TestWithLoading = withLoading(TestComponent)

render() {
return <TestWithLoading value="testVal" loading={this.state.loading} />
}

我收到错误消息 TS2339: Property 'value' does not exist on type 'IntrinsicAttributes & IntrinsicClassAttributes<Component<Loading, any, any>>
& Readonly<{ children?: ReactNode; }> & Readonly<Loading>'.

所以我查看了@types/recompose 中的类型定义。 branch<TOutter>返回 ComponentEnhancer<any,TOutter> .据我了解,我希望能够提供 any组件,以及 <TOutter>通用是这样的,结果组件知道测试功能所需的 Prop 。这也可以在没有额外 Prop 的情况下工作。

但是 ComponentEnhancer 的 TypeDefinition 看起来像这样(重构 0.30.2):

interface ComponentEnhancer<TInner, TOutter> {
(component: Component<TInner>): ComponentClass<TOutter>
}

因此,ComponentEnhancer<any, Loading>我从之前的branch收到的函数将返回 ComponentClass<Loading> .然而 <TInner>我提供给 ComponentEnhancer 的组件将被丢弃,我无法使用我的 Value增强组件中的 Prop 。

所以我的问题是,我是不是做错了,有没有更好的方法来实现这一点(通过重组)。或者它只是 TypeDeclaration 中的一个 Bug,因为更改了 ComponentEnhancer 的返回值至 ComponentClass<TOutter & TInner>为我解决了整个问题。对此有什么想法吗?

最佳答案

我不熟悉 branchrecompose 但如果这只是一个打字问题,我们可以解决它。

问题是 branch 的类型不是很好。如果目的是将包装组件的属性转发到 HOC 并将显式输入到 branch 的 props 添加到 HOC,那么更好的结果类型将是:

type BetterComponentEnhancer<TOutter> = {
<TInner>(component: React.ComponentType<TInner>): React.ComponentClass<TInner & TOutter>
}

对于这种类型,这将起作用:

const withLoading = branch<Loading>(
({ loading }) => loading,
renderComponent(LoadingComponent)
)as unknown as BetterComponentEnhancer<Loading>

type BetterComponentEnhancer<TOutter> = {
<TInner>(component: React.ComponentType<TInner>): React.ComponentClass<TInner & TOutter>
}

const TestWithLoading = withLoading(TestComponent)

function render() {
return <TestWithLoading value="testVal" loading={true} />
}

关于javascript - 使用 recompose 和 typescript 正确输入 HigherOrderComponents,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54025204/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com