作者:判官-包公_529 | 来源:互联网 | 2024-12-27 16:40
当我们在 React 和 TypeScript 环境中工作时,正确处理组件和上下文是非常重要的。以下是关于如何通过高阶组件(HOC)来消耗上下文的一些关键点:
对于组件类型,应使用 React.ComponentType
。这不仅适用于函数组件,也适用于类组件。直接使用 new () => ...
的签名在这里并不合适,因为它不能完全匹配所有组件类型。
为了确保 ThemedButton
在使用时不会包含不必要的属性,我们可以利用 TypeScript 的高级类型操作。具体来说,我们需要排除某些特定的属性,例如 theme
:
function ThemedComponent(props: Pick>) {}
这里的关键在于两个 TypeScript 操作符:Exclude
和 Pick
。它们的作用是分别过滤掉不需要的键,并从原始类型中提取出所需的属性。
通过这种方式,我们可以创建一个新组件,它继承了 ThemedButton
的所有属性,但不包括 theme
属性,从而避免了错误的发生。
完整的 HOC 实现如下:
function withTheme(Component: React.ComponentType
) { return function ThemedComponent(props: Pick
>) { return ( {(theme) => } ) }}
此外,还有一篇优秀的博客文章详细介绍了这一主题,并提供了一些简化类型的技巧,比如使用 Omit
来代替 Pick<...>
。
值得注意的是,在 TypeScript 3.2 及之后版本中,传播行为有所变化,可能会导致 props
类型被擦除的问题。为了解决这个问题,可以强制转换 props
为 P
:
return ( {(theme) => } )