If I use interface ExampleProps extends WithTranslationProps {}
the type incompatibility disappears, but I can't access the t
function, because the WithTranslationProps
only has a i18n?
nullable type and I can't add anything to the ExampleProps
, because I get Property 'newProperty' is missing in type 'WithTranslationProps' but required in type 'ExampleProps'.
const t1 = this.props.i18n?.t;
results in TS2722: Cannot invoke an object which is possibly 'undefined'
when trying to call t('Test')
.
const t2 = this.props.t;
does not exists.
One solution, If I just initialize the state directly in the class, like:
class Example extends React.Component<ExampleProps, ExampleState> {
state = {
// set state here
}
render() {
Although I would still like to know if there is a way to use a constructor here.
CodePudding user response:
In react constructor and super methods receive either 0 parameters or 1 (if it's 1, then they should be props), as per documentation
In your render you can just do
render () {
const { t } = this.props;
return (
<div>
<p>{t('Test')}</p>
</div>
);
}
This deconstruction of the components props makes your code more readable, if you need more variables from props, just add a comma and the name of the variable, and it will be usable inside that function.
Other than that your code seems fine
CodePudding user response:
From the React documentation:
If you don’t initialize state and you don’t bind methods, you don’t need to implement a constructor for your React component.
But, wait a minute, what is the context
you passed to constructor
?
you only need to pass props
as the parameter of the constructor
.
constructor(props)