И каждая возможная комбинация ограничений для этих параметров типа. Учитывая, что ограничения могут зависеть от параметров других типов, это потребует фальсификации типов с более высоким родом.
ct with material-ui я пытаюсь создать компонент JSX, который принимает общие параметры, а также используетwithStyles
HOC, чтобы ввести мои стили.
Первый подход был такой:
const styles = (theme: Theme) => createStyles({
card: {
...
}
});
interface Props<T> {
prop: keyof T,
...
}
type PropsWithStyles<T> = Props<T> & WithStyles<typeof styles>;
export default withStyles(styles)(
class BaseFormCard<T> extends React.Component<PropsWithStyles<T>> {
...
}
),
Но при попытке использовать общие типы теряются
<BaseFormCard<MyClass> prop={ /* no typings here */ } />
Единственное решение, которое я смог найти, заключалось в том, чтобы обернуть экспорт в функцию, которая принимает универсальный параметр и создает компонент.
export default function WrappedBaseFormCard<T>(props: Props<T>): ReactElement<Props<T>> {
const wrapper = withStyles(styles)(
class BaseFormCard<T> extends React.Component<PropsWithStyles<T>> {
...
}
) as any;
return React.createElement(wrapper, props);
}
Однако это нелепо сложно и даже связано с затратами времени выполнения, хотя оно только пытается решить проблемы набора текста.
Должен быть лучший способ использовать компоненты JSX с общими параметрами и HOC.
Это тесно связано с проблемой здесьhttps://github.com/mui-org/material-ui/issues/11921, но никогда не было удовлетворительного решения, и проблема сейчас закрыта.