如何编写HOC而不出现类型错误?

时间:2019-02-11 09:58:57

标签: reactjs typescript higher-order-components

在我们的应用程序中,我们使用i18next(公开HOC withNamespaces)和material-ui(公开HOC withStyles),并且必须使用打字稿。有些组件需要翻译和样式,因此它们具有诸如

interface MyCompProps extends WithStyles, WithNamespaces {
    // actually relavent props here
}

并与两个HOC一起导出

export default withStyles(styles, { withTheme: true })(withNamespaces()(MyComp as any)) as typeof MyComp;

这有一些问题,例如:

  1. 嵌套这样的函数调用不可读
  2. 我们需要两个强制转换(as anyas typeof MyComp)才能正常工作,否则我们将遇到类型错误。有时我们在投射后仍然会遇到类型错误。

如果我们有普通的JS,我会写

export default compose(
    withStyles(styles, { withTheme: true }),
    withNamespaces()
)(MyComp)

但是在TS中,此函数返回一个{}而不是一个typeof MyComp(没有WithStyles和WithNamespaces),正如我所期望的那样。 我可以强制将其设置为typeof MyComp,但随后使用此组件会抱怨我没有为WithStylesWithNamespaces设置字段。

如何组成这些HOC,以便正确生成结果类型?
据我了解,结果类型应为ComponentClass<MyCompProps>,且不包含WithStylesWithNamespaces字段。

0 个答案:

没有答案