В нашем приложении мы используем 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;
Это имеет некоторые проблемы, например:
- Вложенные вызовы функций не читаются
- Нам нужно два приведения (
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
.