Using State in React with TypeScript
When working with React and TypeScript, it’s common to encounter issues with accessing and assigning state values. In this blog post, we’ll explore how to properly use state in React components while leveraging TypeScript’s type checking capabilities.
The Problem
Let’s take a look at a specific issue that developers often face when attempting to access a state value within the render method or assign it to a variable inside a function.
interface State {
playOrPause?: string;
}
class Player extends React.Component {
constructor() {
super();
this.state = {
playOrPause: 'Play'
};
}
render() {
return (
<div>
<button
ref={playPause => this.playPause = playPause}
title={this.state.playOrPause} // Error: Property 'playOrPause' does not exist on type 'ReadOnly<{}>'.
>
Play
</button>
</div>
);
}
}
The error message [ts] Property 'playOrPause' does not exist on type 'ReadOnly<{}>'.
indicates that TypeScript is unable to find the playOrPause
property in the component’s state.
The Solution
To resolve this issue, we need to correctly declare the component’s props and state interfaces using TypeScript’s Generics.
interface IProps {}
interface IState {
playOrPause?: string;
}
class Player extends React.Component<IProps, IState> {
constructor(props: IProps) {
super(props);
this.state = {
playOrPause: 'Play'
};
}
render() {
return (
<div>
<button
ref={playPause => this.playPause = playPause}
title={this.state.playOrPause}
>
Play
</button>
</div>
);
}
}
By explicitly declaring the prop and state interfaces with IProps
and IState
respectively, and using TypeScript’s Generics syntax (React.Component<IProps, IState>
), we can inform TypeScript about the expected types for the component’s props and state. This allows TypeScript to accurately validate the usage of state properties and resolve the error.
Functional Components with Hooks
If you prefer functional components with hooks, you can achieve the same result using the useState
hook.
import React, { useState } from 'react';
const Player = () => {
const [playOrPause, setPlayOrPause] = useState<string>('Play');
return (
<div>
<button
ref={playPause => this.playPause = playPause}
title={playOrPause}
>
Play
</button>
</div>
);
};
Using the useState
hook, we initialize the playOrPause
state variable with the initial value of ‘Play’ and receive a function to update the state (setPlayOrPause
). This simplifies state management in functional components.
Conclusion
In this blog post, we explored how to use state effectively in React components with TypeScript. By properly declaring prop and state interfaces and leveraging TypeScript’s type checking capabilities, we can enhance the robustness and maintainability of our React applications. Whether you prefer class components or functional components with hooks, TypeScript provides powerful tools for ensuring type safety in your React codebase.
Happy coding!
reference :
https://stackoverflow.com/questions/46987816/using-state-in-react-with-typescript
Read Another Article :