Я уже некоторое время использую React, и теперь я хочу перейти на использование React с TypeScript. Однако я привык к стилям JSS (через пакет react-jss
), и я не могу понять, как я должен использовать их с TypeScript. Я также использую пакет classnames
, чтобы условно назначить несколько имен классов, и для этого получаю ошибки TypeSCript.
Вот мой шаблон компонента React:
import React, { Component } from 'react';
import withStyles from 'react-jss';
import classNames from 'classnames';
const styles = theme => ({
});
class MyClass extends Component {
render() {
const { classes, className } = this.props;
return (
<div className={classNames({ [classes.root]: true, [className]: className})}>
</div>
);
}
};
export default withStyles(styles)(MyClass);
Я просто изучаю TypeScript, поэтому я не уверен, что даже понимаю ошибки, которые я получаю. Как бы я написал что-то подобное в TypeScript?
ОБНОВЛЕНИЕ
Вот как я окончательно преобразовал свой шаблон:
import React from 'react';
import withStyles, { WithStylesProps } from 'react-jss';
import classNames from 'classnames';
const styles = (theme: any) => ({
root: {
},
});
interface Props extends WithStylesProps<typeof styles> {
className?: string,
}
interface State {
}
class Header extends React.Component<Props, State> {
render() {
const { classes, className } = this.props;
return (
<div className={classNames({ [classes.root as string]: true, [className as string]: className})}>
</div>
);
}
};
export default withStyles(styles)(Header);
имейте в виду:
- при определении объекта
styles
любой член classes
, на который ссылается метод render
, должен быть определен . Без TypeScript вы могли бы избежать «использования» большого количества классов и не определять их, как заполнитель; с TypeScript все они должны быть там; - при вызове функции
classnames
все клавиши должны быть набраны. Если они получены из переменной, которая может быть нулевой или неопределенной, у вас есть для добавления as string
или для преобразования их в строку в противном случае. Кроме этого, свойство className
работает так же, как и без TypeScript.