Как мне составить HOC, не получая ошибку типа? - PullRequest
0 голосов
/ 11 февраля 2019

В нашем приложении мы используем 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 any, as typeof MyComp), чтобы это работало, иначе мы получим ошибки типа.Иногда мы все еще получаем ошибки типа после приведения.

Если бы у нас был простой JS, я написал бы

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

Но в TS эта функция возвращает {} вместоtypeof MyComp (без WithStyles и WithNamespaces), как я и ожидал.Я могу заставить его быть typeof MyComp, но затем использование этого компонента жалуется, что я не устанавливаю поля для WithStyles и WithNamespaces.

Как мне составить эти HOC так, чтобыполученный тип является правильным?
Насколько я понимаю, результирующий тип должен быть ComponentClass<MyCompProps> без полей WithStyles и WithNamespaces.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...