在使用withStyles和withTranslation HOC包装React组件后,Typescript显示错误

时间:2019-11-07 18:13:47

标签: reactjs typescript material-ui react-i18next react-with-styles

我正在尝试使用Typescript,withStyles中的@material-ui/corewithTranslation中的react-i18next来编写React组件。这两个包装器都是HOC。

Typescript抱怨类型错误。

由于某些原因,此行不起作用:

export default withTranslation()(withStyles(styles)(HomePage)); // error

但是,如果我仅使用withStyles或仅使用withTranslation,则效果很好:

export default withTranslation()(HomePage); // ok


export default withStyles(styles)(HomePage); // ok

我知道有关类型,接口的问题,或者以这种方式导出我的组件可能有问题。 当我将withRouterwithStyles一起使用时,我遇到了同样的问题。我通过更改出口行中的订单解决了该错误! (不知道为什么解决了TBH) 我看到了一些建议将整个组件包装在withStyles下的解决方案,但这对我来说似乎很丑陋。有什么建议吗?

这是错误:

(alias) withStyles<"root", {}, {}>(style: Styles<Theme, {}, "root">, options?: {} | undefined): PropInjector<{
    classes: Record<"root", string>;
}, StyledComponentProps<"root">>
import withStyles

Argument of type 'ComponentType<Pick<IProps, "i18n" | "t"> & StyledComponentProps<"root">>' is not assignable to parameter of type 'ComponentType<WithTranslation>'.
  Type 'ComponentClass<Pick<IProps, "i18n" | "t"> & StyledComponentProps<"root">, any>' is not assignable to type 'ComponentType<WithTranslation>'.
    Type 'ComponentClass<Pick<IProps, "i18n" | "t"> & StyledComponentProps<"root">, any>' is not assignable to type 'ComponentClass<WithTranslation, any>'.
      Types of property 'propTypes' are incompatible.
        Type 'WeakValidationMap<Pick<IProps, "i18n" | "t"> & StyledComponentProps<"root">> | undefined' is not assignable to type 'WeakValidationMap<WithTranslation> | undefined'.
          Type 'WeakValidationMap<Pick<IProps, "i18n" | "t"> & StyledComponentProps<"root">>' is not assignable to type 'WeakValidationMap<WithTranslation>'.
            Types of property 'i18n' are incompatible.
              Type 'Validator<{ changeLanguage: Function; }> | undefined' is not assignable to type 'Validator<i18n> | undefined'.
                Type 'Validator<{ changeLanguage: Function; }>' is not assignable to type 'Validator<i18n>'.
                  Type '{ changeLanguage: Function; }' is missing the following properties from type 'i18n': t, init, loadResources, use, and 28 more.ts(2345)
index.d.ts(80, 3): 'tReady' is declared here.

这是我的组件:

import React, { PureComponent } from "react";
// i18n
import { withTranslation } from "react-i18next";
import { InterfaceI18n } from "../../i18n";
// Stylus
import { WithStyles } from "@material-ui/core";
import withStyles from "@material-ui/core/styles/withStyles";
import styles from "./HomePage.style";

type WrapperPropsStylus = WithStyles<typeof styles>;
interface IProps extends InterfaceI18n, WrapperPropsStylus {}

class HomePage extends PureComponent<IProps> {
  changeLanguage = (lng: string) => {
    const { i18n } = this.props;
    i18n.changeLanguage(lng);
  };
  public render() {
    const { classes, t } = this.props;
    return (
      <div className={classes.root}>
        <div>
          This is the home page (Public page) <br />
        </div>
        {t("Welcome to React")} <br />
        <button onClick={() => this.changeLanguage("de")}>de</button>
        <button onClick={() => this.changeLanguage("en")}>en</button>
      </div>
    );
  }
}

export default withTranslation()(withStyles(styles)(HomePage));

1 个答案:

答案 0 :(得分:1)

好吧,为了解决这个问题,我将Component更改为Hooks。 只需使用Hooks而不是Classes Components,使用TS会容易得多。